在 java.util.Function 中有 43 个接口。不能指望全部记住它们,但是如果记住了六个基本接口,就可以在需要它们时派生出其余的接口。基本接口操作于对象引用类型。

Operator 接口表示方法的结果和参数类型相同。

Predicate 接口表示其方法接受一个参数并返回一个布尔值。

Function 接口表示方法其参数和返回类型不同。

Supplier 接口表示一个不接受参数和返回值 (或“供应”) 的方法。

Consumer 表示该方法接受一个参数而不返回任何东西,本质上就是使用它的参数。

六种基本函数式接口概述如下:

接口 方法 示例
UnaryOperator<T> T apply(T t) String::toLowerCase
BinaryOperator<T> T apply(T t1, T t2) BigInteger::add
Predicate<T> boolean test(T t) Collection::isEmpty
Function<T,R> R apply(T t) Arrays::asList
Supplier<T> T get() Instant::now
Consumer<T> void accept(T t) System.out::println

在处理基本类型 int,long 和 double 的操作上,六个基本接口中还有三个变体。 它们的名字是通过在基本接口前加一个基本类型而得到的。 因此,例如,一个接受 int 的 Predicate 是一个 IntPredicate ,而一个接受两个long 值并返回一个 long 的二元运算符是一个 LongBinaryOperator 。 除 Function 接口变体通过返回类型进行了参数化,其他变体类型都没有参数化。 例如, LongFunction<int[]> 使用 long 类型作为参数并返回了 int [] 类型。

Function 接口还有九个额外的变体,当结果类型为基本类型时使用。 源和结果类型总是不同,因为从类型到它自身的函数是 UnaryOperator 。 如果源类型和结果类型都是基本类型,则使用带有 SrcToResult 的前缀Function ,例如 LongToIntFunction (六个变体)。如果源是一个基本类型,返回结果是一个对象引用,那么带有 ToObj 的前缀 Function ,例如 DoubleToObjFunction (三种变体)。

有三个包含两个参数版本的基本功能接口,使它们有意义: BiPredicate <T,U> , BiFunction <T,U,R> 和 BiConsumer <T,U> 。 也有返回三种相关基本类型的 BiFunction 变体: ToIntBiFunction <T,U> , ToLongBiFunction<T,U> 和 ToDoubleBiFunction <T,U> 。Consumer 有两个变量,它们带有一个对象引用和一个基本类型: ObjDoubleConsumer <T> , ObjIntConsumer <T> 和 ObjLongConsumer <T> 。 总共有九个两个参数版本的基本接口。

最后,还有一个 BooleanSupplier 接口,它是 Supplier 的一个变体,它返回布尔值。 这是任何标准函数式接口名称中唯一明确提及的布尔类型,但布尔返回值通过 Predicate 及其四种变体形式支持。 前面段落中介绍的 BooleanSupplier 接口和 42 个接口占所有四十三个标准功能接口。 无可否认,这是非常难以接受的,并且不是非常正交的。 另一方面,你所需要的大部分功能接口都是为你写的,而且它们的名字是经常性的,所以在你需要的时候不应该有太多的麻烦。

大多数标准函数式接口仅用于提供对基本类型的支持。 不要试图使用基本的函数式接口来装箱基本类型的包装类而不是基本类型的函数式接口。 虽然它起作用,但它违反了第 61 条中的建议:“优先使用基本类型而不是基本类型的包装类”。使用装箱基本类型的包装类进行批量操作的性能后果可能是致命的。

Effective Java~44. 坚持使用标准的函数接口相关推荐

  1. java.util接口_函数接口– Java 8中java.util.function包中的函数接口

    java.util接口 我以前写过有关功能接口及其用法的文章. 如果您正在探索要成为Java 8一部分的API,尤其是那些支持lambda表达式的API,您会发现很少的接口,例如Function,Su ...

  2. 函数接口– Java 8中java.util.function包中的函数接口

    我以前写过有关功能接口及其用法的文章. 如果您正在探索要成为Java 8一部分的API,尤其是那些支持lambda表达式的API,您会发现很少的接口,例如Function,Supplier,Consu ...

  3. Java:Effective java学习笔记之 考虑实现Comparable 接口

    Java 考虑实现Comparable 接口 考虑实现Comparable 接口 1.Comparable接口 2.为什么要考虑实现Comparable接口 3.compareTo 方法的通用约定 4 ...

  4. Effective Java之优先使用标准的异常(六十)

    Java平台类库提供了一组基本的未受检的异常,他们满足了绝大部分API的异常抛出异常. 为什么优先使用标准异常 1.它使你的API可读性更强,因为它与程序员习惯的用法一致. 2.异常类越少,程序在类装 ...

  5. Effective Java读书笔记---四、类和接口

    四.对于所有对象都通用的方法 15.使类和成员的可访问性最小化 区分一个组件设计得好不好,唯一重要的因素在于,它对于外部的其他组件而言,是否隐藏了其 内部数据和其他实现细节 . 信息隐藏 -----& ...

  6. Effective Java(第3版) 90条经验法则

    目录 第2章 创建和销毁对象 第1条:用静态工厂方法替代构造器 第2条:遇到多个构造器参数时要考虑使用构建器 例子 使用 第3条:用私有构造器或者枚举类型强化Singleton属性 例子 使用 第4条 ...

  7. 《Effective Java》真的是一本值得一直去钻研的好书

    文章目录 <Effective Java>读书笔记 第一章 引言 第二章 创建和销毁对象 1 考虑使用静态工厂方法替代构造方法** 2 当构造方法参数过多时使用builder(建造者) 模 ...

  8. 《Effective Java》中文版第3版 读书笔记

    评论中有电子档资源哦  ^_^ 第1章引言 第2章创建和销毁对象 第1条:用静态工厂方法代替构造器 静态工厂方法与构造器不同的第一大优势在于,它们有名称.  静态工厂方法与构造器不同的第二大优势在于, ...

  9. Effective java 3th-读书笔记

    第二章 创建和销毁对象 第1条.用静态工厂方法替代构造器 它只是一个返回类实例的静态方法,不同于设计模式的工厂模式. 优点: 1.静态工厂方法有名称,易读.易用 一个类只能有一个带有指定签名的构造器, ...

最新文章

  1. 关于cisco与中兴三层设备ospf互连
  2. 「后端小伙伴来学前端了」Element修改默认样式 | 记录自己学习前端踩坑日记
  3. web框架django初探
  4. nodejs写html文件路径,Nodejs读取文件时相对路径的正确写法(使用fs模块)
  5. 七国要求科技巨头预留后门 应对马甲芯片高度警惕
  6. web项目的创建和发布
  7. Android官方开发文档Training系列课程中文版:布局性能优化之ListView的优化
  8. 试问我们都在做些什么类型的测试?
  9. 记录点滴23(中秋、国庆篇)
  10. 【VUE】微商城(四)----封装轮播图组件,axios安装使用
  11. 嵌入式C编程中的设计模式之二——状态机模式
  12. 输出dom对象的HTML,console 输出 DOM 对象
  13. 耗时8个小时用纯HTML和CSS写成的学成在线
  14. 【转载】手机UC浏览器缓存视频合并方法
  15. iif在mysql能用不_在写SQL语句时,你们会经常用IIF(ISNULL(字段))吗
  16. java ews appointment_EWS Java API 1.1创建约会 - 缺少TimeZoneDefinition
  17. 90句美丽的英文及翻译
  18. 济南2022年全面实行电子劳动合同,爱签电子合同为HR赋能增效
  19. 电化学传感器电路设计
  20. 我的编程奋斗历程[四部曲之四]-决定创业篇

热门文章

  1. 云原生之容器安全实践
  2. 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解
  3. 论文浅尝 - EMNLP2020 | 跨媒体关键词预测: 多模态多头注意力和图像文本的统一框架...
  4. 论文浅尝 | 基于多模态关联数据嵌入的知识库补全
  5. PyTorch 读取大数据
  6. 推荐系统经典论文学习
  7. 记使用talend从oracle抽取数据时,数字变为0的问题
  8. MapReduce过程详解及其性能优化
  9. mysql递归层次查询
  10. JS判断正则表达式验证规则