【Java技术指南】「Java8技术盲区」函数接口字典:看看还有哪些你所不知道函数接口?(技术小贴士)

简介: 【Java技术指南】「Java8技术盲区」函数接口字典:看看还有哪些你所不知道函数接口?(技术小贴士)

函数接口的定义


函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。




函数接口的特点


  • 函数式接口可以被隐式转换为lambda表达式。
  • Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。
  • 如定义了一个函数式接口如下:
@FunctionalInterface
interface FunctionInterfaceSample {
    void handle(Object parameter);
}
复制代码


那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的):

FunctionInterfaceSample functionSample = param -> System.out.println(param);
复制代码




Java8之前已经定义的函数接口


函数式接口可以对现有的函数友好地支持 lambda,大家可以直接放心使用!


  • java.lang.Runnable:runable线程可执行操作接口
  • java.util.concurrent.Callable:Callbale线程可执行接口
  • java.security.PrivilegedAction:权限控制器
  • java.util.Comparator:排序比较接口
  • java.io.FileFilter:文件过滤器
  • java.nio.file.PathMatcher:路径匹配器
  • java.lang.reflect.InvocationHandler:动态代理接口
  • java.beans.PropertyChangeListener:properties属性监控接口
  • 等等




Java8新增加的函数接口


主要包含在java.util.function包里面,它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:



普通双参类型函数接口:


  1. BiConsumer<T,U>:代表了一个接受两个输入参数的操作,并且不返回任何结果
  2. BiFunction<T,U,R>:代表了一个接受两个输入参数的方法,并且返回一个结果
  3. BinaryOperator:代表了一个作用于两个同类型操作符的操作,并且返回了操作符同类型的结果
  4. BiPredicate<T,U>:代表了一个两个参数的boolean值方法。



双参类型函数接口:


  1. BooleanSupplier:代表了boolean值结果的提供方
  2. Consumer:代表了接受一个输入参数并且无返回的操作
  3. Function<T,R>:接受一个输入参数,返回一个结果。




Double类型函数接口:


  1. DoubleConsumer:代表一个接受double值参数的操作,并且不返回结果。
  2. DoubleFunction:代表接受一个double值参数的方法,并且返回结果
  3. DoublePredicate:代表一个拥有double值参数的boolean值方法
  4. DoubleSupplier:代表一个double值结构的提供方
  5. DoubleToIntFunction:接受一个double类型输入,返回一个int类型结果。
  6. DoubleToLongFunction:接受一个double类型输入,返回一个long类型结果
  7. DoubleUnaryOperator:接受一个参数同为类型double,返回值类型也为double 。
  8. DoubleBinaryOperator:代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。




Integer类型函数接口:


  1. IntBinaryOperator:接受两个参数同为类型int,返回值类型也为int 。
  2. IntConsumer:接受一个int类型的输入参数,无返回值 。
  3. IntFunction:接受一个int类型输入参数,返回一个结果 。
  4. IntPredicate:接受一个int输入参数,返回一个布尔值的结果。
  5. IntSupplier:无参数,返回一个int类型结果。
  6. IntToDoubleFunction:接受一个int类型输入,返回一个double类型结果 。
  7. IntToLongFunction:接受一个int类型输入,返回一个long类型结果。
  8. IntUnaryOperator:接受一个参数同为类型int,返回值类型也为int 。



Long类型函数接口:


  1. LongBinaryOperator:接受两个参数同为类型long,返回值类型也为long。
  2. LongConsumer:接受一个long类型的输入参数,无返回值。
  3. LongFunction:接受一个long类型输入参数,返回一个结果。
  4. LongPredicate:R接受一个long输入参数,返回一个布尔值类型结果。
  5. LongSupplier:无参数,返回一个结果long类型的值。
  6. LongToDoubleFunction:接受一个long类型输入,返回一个double类型结果。
  7. LongToIntFunction:接受一个long类型输入,返回一个int类型结果。
  8. LongUnaryOperator:接受一个参数同为类型long,返回值类型也为long。
  9. ObjDoubleConsumer:接受一个object类型和一个double类型的输入参数,无返回值。
  10. ObjIntConsumer:接受一个object类型和一个int类型的输入参数,无返回值。
  11. ObjLongConsumer:接受一个object类型和一个long类型的输入参数,无返回值。



Long类型函数接口:


  1. Predicate:接受一个输入参数,返回一个布尔值结果。
  2. Supplier:无参数,返回一个结果。



转换类型接口


  1. ToDoubleBiFunction<T,U> 接受两个输入参数,返回一个double类型结果
  2. ToDoubleFunction 接受一个输入参数,返回一个double类型结果
  3. ToIntBiFunction<T,U> 接受两个输入参数,返回一个int类型结果。
  4. ToIntFunction 接受一个输入参数,返回一个int类型结果。
  5. ToLongBiFunction<T,U> 接受两个输入参数,返回一个long类型结果。
  6. ToLongFunction 接受一个输入参数,返回一个long类型结果。
  7. UnaryOperator 接受一个参数为类型T,返回值类型也为T。




函数接口配合Stream流工作


Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。


  • 元素流在管道中经过中间操作(函数接口、处理操作)的处理(管道的节点上进行处理, 比如筛选, 排序,聚合等),最后由最终操作(terminal operation)得到前面处理的结果。
+--------------------+       +------+   +------+   +---+   +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+       +------+   +------+   +---+   +-------+
复制代码


元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算,聚合操作:filter, map, reduce, find, match, sorted等。


  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。




(Java8其他API)内容小贴士


Java8的时间日期API


  • Instant         时间戳
  • Duration        持续时间、时间差
  • LocalDate       只包含日期,比如:2018-09-24
  • LocalTime       只包含时间,比如:10:32:10
  • LocalDateTime   包含日期和时间,比如:2018-09-24 10:32:10
  • Peroid          时间段
  • ZoneOffset      时区偏移量,比如:+8:00
  • ZonedDateTime   带时区的日期时间
  • Clock           时钟,可用于获取当前时间戳
  • java.time.format.DateTimeFormatter      时间格式化类



Java8的Base64API-小贴士


  • Base64编码已经成为Java类库的标准,Base64 编码的编码器和解码器,Java8提供了一套静态方法获取下面三种Base64编解码器:
  • 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
  • URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
  • MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用'\r'并跟随'\n'作为分割。编码输出最后没有行分割。



内嵌类

image.png



方法列表

image.png


Base64 实例


public static void main(String[] args){
        String str = new String(Base64.getEncoder().encode("1231231231231".getBytes()));
        System.out.println(str);
        str = new String(Base64.getDecoder().decode(str));
        System.out.println(str);
        String str2 = Base64.getEncoder().encodeToString("1231231231231".getBytes("utf-8"));
        System.out.println("Base64 编码字符串 :" + str2);
        String mimeEncodedString = Base64.getMimeEncoder().encodeToString(UUID.randomUUID().toString());
        System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);
}




相关文章
|
3天前
|
Java
死磕-java并发编程技术(二)
死磕-java并发编程技术(二)
|
3天前
|
存储 Java 调度
死磕-java并发编程技术(一)
死磕-java并发编程技术(一)
|
3天前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
13 1
java基础(11)函数重载以及函数递归求和
|
13天前
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
13 5
Java——抽象类和接口
|
13天前
|
Java
Java——接口的使用实例
Comparable接口用于自定义类的对象比较。通过实现此接口并重写`compareTo`方法,可以定义自定义类型的比较规则。 接下来介绍了Comparator接口,它提供了一种更灵活的比较方式。通过实现Comparator接口并重写`compare`方法,可以根据不同属性定义不同的比较规则。例如,定义一个`BrandComparator`类来比较汽车的品牌。 最后,介绍了Cloneable接口,用于实现对象的克隆。实现该接口并重写`clone`方法后,可以创建对象的浅拷贝或深拷贝。浅拷贝仅复制对象本身,深拷贝则会递归复制所有成员变量。
14 4
Java——接口的使用实例
|
5天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
23 6
|
7天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
21 7
|
4天前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
23 2
|
9天前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
29 2
|
15天前
|
存储 负载均衡 Java
Jetty技术深度解析及其在Java中的实战应用
【9月更文挑战第3天】Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
30 2