【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);
}




相关文章
|
4天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
5天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
16 1
|
10天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
38 4
|
9天前
|
JSON 前端开发 JavaScript
java-ajax技术详解!!!
本文介绍了Ajax技术及其工作原理,包括其核心XMLHttpRequest对象的属性和方法。Ajax通过异步通信技术,实现在不重新加载整个页面的情况下更新部分网页内容。文章还详细描述了使用原生JavaScript实现Ajax的基本步骤,以及利用jQuery简化Ajax操作的方法。最后,介绍了JSON作为轻量级数据交换格式在Ajax应用中的使用,包括Java中JSON与对象的相互转换。
18 1
|
14天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
30 3
|
14天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
9 2
|
14天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
16 1
|
14天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
29 1
|
15天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
15天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
16 1