JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上。现如今,我们则从Function常用函数入口,真正了解一下。

name type description
Consumer Consumer< T > 接收T对象,不返回值
Predicate Predicate< T > 接收T对象并返回boolean
Function Function< T, R > 接收T对象,返回R对象
Supplier Supplier< T > 提供T对象(例如工厂),不接收值
UnaryOperator UnaryOperator 接收T对象,返回T对象
BinaryOperator BinaryOperator 接收两个T对象,返回T对象

标注为FunctionalInterface的接口被称为函数式接口,该接口只能有一个自定义方法,但是可以包括从object类继承而来的方法。如果一个接口只有一个方法,则编译器会认为这就是一个函数式接口。是否是一个函数式接口,需要注意的有以下几点:

该注解只能标记在”有且仅有一个抽象方法”的接口上。

JDK8接口中的静态方法和默认方法,都不算是抽象方法。

接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
在一个接口中定义两个自定义的方法,就会产生Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface错误.
Function常用方法&&实践

//将Function对象应用到输入的参数上,然后返回计算结果。

R apply(T t);

例子1,先来个简单版的:传String,返回String。

package org.dreams.transaction;import java.util.function.Function;public class FunctionTest<In, Out> {private Function<In, Out> processor = new Function<In, Out>() {@Overridepublic Out apply(In in) {return (Out) new String("apply:" + in);}};public static void main(String[] args) {FunctionTest<String, String> functionTest = new FunctionTest();System.out.println(functionTest.processor.apply("hello~!"));}
}
lambda表达式的写法:package org.dreams.transaction;import java.util.function.Function;public class FunctionTest<In, Out> {private Function<In, Out> processor = in -> {return (Out) new String("apply:" + in);};public static void main(String[] args) {FunctionTest<String, String> functionTest = new FunctionTest();System.out.println(functionTest.processor.apply("hello~!"));}
}

例子二:
andThen方法

//返回一个先执行当前函数对象apply方法再执行after函数对象apply方法的函数对象。
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t) -> after.apply(apply(t));}

compose方法

//返回一个先执行before函数对象apply方法再执行当前函数对象apply方法的函数对象
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {Objects.requireNonNull(before);return (V v) -> apply(before.apply(v));}

完整代码

package org.dreams.transaction.java8;import java.util.function.Function;public class Function2Test{public static void main(String[] args) {Function<Integer, Integer> name = e -> e * 2;Function<Integer, Integer> square = e -> e * e;int value = name.andThen(square).apply(3);System.out.println("andThen value=" + value);int value2 = name.compose(square).apply(3);System.out.println("compose value2=" + value2);//返回一个执行了apply()方法之后只会返回输入参数的函数对象Object identity = Function.identity().apply("huohuo");System.out.println(identity);}
}

返回结果

andThen value=36
compose value2=18
huohuo

java.util.function.Function的用法相关推荐

  1. java.util.sortedmap_Java SortedMap lastKey()用法及代码示例

    Java中SortedMap接口的lastKey()方法用于返回此映射中当前的最后一个或最大键. 用法: K lastKey() 其中,K是此Set维护的 key 的类型. 参数:此函数不接受任何参数 ...

  2. java.util.stream_java.util.stream.Stream 接口中的常用方法

    流模型的操作很丰富,下面介绍一些常用的API.这些方法可以被分成两种: 延迟方法 返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用.(除了终结方法外,其余方 法均为延迟方法.) 终 ...

  3. java.util.timezone_java.util.TimeZone.getTimeZone()

    描述 所述getTimeZone(String ID)方法被用来获得用于给定ID的时区. 声明 以下是java.util.TimeZone.getTimeZone()方法的声明. public sta ...

  4. java nextgaussian(),java.util.Random.nextGaussian()

    描述 所述nextGaussian()方法用于从该随机数生成器的序列平均值是0.0,标准偏差1.0,以获得下一个伪高斯("正常")分布的双精度值. 声明 以下是java.util. ...

  5. Function接口 – Java8中java.util.function包下的函数式接口

    作者:   Mohamed Sanaulla  译者: 李璟(jlee381344197@gmail.com) 早先我写了一篇<函数式接口>,探讨了Java8中函数式接口的用法.如果你正在 ...

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

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

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

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

  8. Java的java.util.function.Function接口中identity方法解析

    java.util.function.Function是函数式接口,它的特点是有且只有一个抽象方法,这样的接口被@FunctionalInterface所注释,能够应用于JDK1.8开始的函数式编程. ...

  9. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

最新文章

  1. Oracle中不同条件的日期查询
  2. oracle报错ora-12162,ORA-12162: TNS: 指定的 Net 服务名不正确
  3. Fiori configuration edit also needs enqueue
  4. mysql pdo prepare_PDO::prepare
  5. python画国际象棋_python图形工具turtle绘制国际象棋棋盘
  6. apache license 2.0如何使用防止法律纠纷_Thinkphp + queue 使用队列进行 邮件通知
  7. python Selenium调用 IE/GoogleChrome/Firefox浏览器驱动的方法及下载地址
  8. java 索引实现,Java创建ES索引实现
  9. 1.从Paxos到Zookeeper分布式一致性原理与实践---分布式架构
  10. Windows10安装sql2016配置iis问题
  11. 马哥linux的ppt,包合集马哥linux-2016全新专用ppt mysql replication.pdf
  12. 将jpg格式转成PDF格式的转换器
  13. 微机原理8086CPU结构和功能
  14. 【Python模块】图形化编程模块-turtle
  15. Ubuntu/CentOS 磁盘分区扩展
  16. lifeifei翻译目录
  17. oracle如何恢复表中删除的数据?
  18. 数据结构复习题(线性表)
  19. 使用键鼠网络共享用windows控制ubuntu,实现跨屏跨系统操作
  20. tableviewCell复用 重叠问题

热门文章

  1. th:text为null报错_为vue3.0的学习TS解读高级类型
  2. footer.php置底,CSS五种方式实现Footer置底
  3. Java LocalDate类| minusWeeks()方法与示例
  4. html页面授权码,spring boot 2.0 整合 oauth2 authorization code授权码模式
  5. 3dmax镜像后模型线条乱了_3dMax入门教程来啦!小白赶紧收藏!
  6. 有重复数字的组合问题_带数字重复的组合和问题
  7. ruby array_在Ruby中使用Array.delete()和Array.delete_at()从Array中移除元素
  8. 第 1-6 课:玩转时间 + 面试题
  9. HashMap 为什么会导致 CPU 100%?文章看不懂?来看这个视频吧!——面试突击 006 期...
  10. 面试官:使用SpringBoot如何开发邮件发送系统?