第二章 JDK8新特性2之四大函数接口

  在使用lambda表达式和自定义函数接口后,基本已实现java的函数式编程。但是一个自定义函数接口只做一件事,我们在使用的时候只关心需要输入什么参数、用这些参数来做什么,以及返回什么结果;至于接口名称,接口里的函数名称是阿猫阿狗,并不用care。所以直接用一个统一的接口来代替自定义接口,就不用自定义接口了。

2.1 jkd8函数接口Function

Function的使用很简单,只要把上篇的自定义接口改成Function,初体验:

 1 public class LambdaTester {
 2     public static void main(String[] args) {
 3         System.out.println("main function...");
 4         testFunction();
 5     }
 6
 7 //以函数式接口作为参数
 8 //接口Function<T,R>,接收两个范型,T为参数类型,R为返回值类型
 9     private String operate2(Integer x, Function<Integer,String> foperation){
10         return foperation.apply(x);
11     }
12
13     //测试函数接口,用两种方法实现Integer转String
14     public static void testFunction() {
15         LambdaTester tester = new LambdaTester();
16
17         System.out.println("Integer转String 1:" + tester.operate2(6,x -> x.toString()));
18         System.out.println("Integer转String 2:" + tester.operate2(8,x -> x + ""));
19
20     }
21 }

输出:

main function...
Integer转String的方法1:6
Integer转String的方法2:8

Function中定义了四个方法,摘出来瞧瞧:

 1 @FunctionalInterface
 2 public interface Function<T, R> {
 3
 4     R apply(T t); //输入T,经apply执行后返回R
 5
 6     default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
 7         Objects.requireNonNull(before);
 8         return (V v) -> apply(before.apply(v));
 9     }
10
11     default <V> Function<T, V> andThen(Function<? super R, ? extends V> after){
12         Objects.requireNonNull(after);
13         return (T t) -> after.apply(apply(t));
14     }
15
16     static <T> Function<T, T> identity() {
17         return t -> t;
18     }
19 }

2.1.1 andThen和compose详解

  Function中的两个default函数andThen和compose,乍一看不知道干嘛的,都是接收一个Function返回一个Function,函数定义也类似。这种函数的强大之处是可以链式调用,先看andThen的例子:

 1 public class LambdaTester {
 2     public static void main(String[] args) {
 3         System.out.println("main function...");
 4 //        testLambda();
 5 //        testFunction();
 6 //        testDefault();
 7         testAndThen();
 8     }
 9
10 //以函数式接口作为参数
11     private String operate3(String x, Function<String,String> foperation){
12         return foperation.apply(x);
13     }
14
15 public static void testAndThen(){
16         LambdaTester tester = new LambdaTester();
17         //函数接口的链式调用
18         Function<String,String> function = x -> x + "world,";
19
20         //andThen()
21         // @param: Function<? super R, ? extends V> after:接收参数为Function,Function操作的参数是上一个Function执行的结果
22         // @return: <V> Function<T, V>: 返回一个Function
23         System.out.println("结果为:" + tester.operate3("Hello ",
24                 function.andThen(s -> s + "I’m java8,")
25                         .andThen(s -> s + "enjoy my new feature!")));
26     }
27 }

输出:

main function...
结果为:Hello world,I’m java8,enjoy my new feature!

来分析下代码执行过程:

  第一步:执行operate3,完成字符串拼接,得到结果Hello world,

  第二步:将上一步得到的结果Hello world作为andThen()的参数s,执行lambda表达式,得到结果Hello world,I‘m java8,

  第三步:将上一步得到的结果Hello world,I‘m java8,  执行lambda表达式,得到结果Hello world,I‘m java8,enjoy my new feature!

这是一种典型的链式调用方法,接收上一步执行的结果,处理后返回一个可以进行链式调用的对象,一级一级处理下去。

其他函数接口和Function类似,可以自行查阅API文档。

只有输出没有输入的是提供者supplier,有输入有输出的是消费者consumer。

原文地址:https://www.cnblogs.com/tangkongkong/p/10385020.html

时间: 2024-08-29 11:54:24

第二章 JDK8新特性2之四大函数接口的相关文章

Jdk8新特性之4大函数式接口

函数式接口介绍它们主要在 java.util.function 包中.下面是最常用的几个接口.1. Supplier接口 @FunctionalInterface public interface Supplier<T> { /** * Gets a result. * * @return a result */ T get(); } 2. Consumer接口 @FunctionalInterface public interface Consumer<T> { /** * Pe

一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)

面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部结构 Linux 查询含有某字符串内容的命令grep 查询进程.GC状态.杀死进程 Hadoop五种节点介绍 -----------------------------------------------------------------------------------------------

JDK8 新特性

JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 重复注解和类型注解 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升. 如下示例,将一个匿名类转换为Lambda表达

java进阶一之jdk8新特性

1.官方发布的jdk8新特性 2.51CTO相关专题

jdk8新特性

jAVA8 十大新特性 投稿:junjie 字体:[增加 减小] 类型:转载 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API "Java is still not dead-and people are starting to figure that out." 本教程将用带注释的简单代码来描述新特性,你将

类的加载、时机、反射、模板设计、jdk7/jdk8新特性(二十六)

1.类的加载概述和加载时机 * A:类的加载概述 * 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. * 加载 * 就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象. * 连接 * 验证 是否有正确的内部结构,并和其他类协调一致 * 准备 负责为类的静态成员分配内存,并设置默认初始化值 * 解析 将类的二进制数据中的符号引用替换为直接引用 * 初始化 就是我们以前讲过的初始化

jdk8新特性之lambda expressions

本文分两部分: 语法简单说明 lambda的使用 注:这两部分内容均以类+注释的方式进行说明,并且内容均来自官方教程(https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html). 第一部分: /** * 语法说明类 * * lambda表达式包含下面几个要素: * 1.逗号分隔的参数列表,如CheckPerson.test(Person p),其中p表示一个Person的对象实例 * 2.向右箭头 →,

jdk8新特性之Lambda

Lambda体验Lambda是一个匿名函数,可以理解为一段可以传递的代码.Lambda表达式写法,代码如下:借助Java 8的全新语法,上述 Runnable 接口的匿名内部类写法可以通过更简单的Lambda表达式达到相同的效果 /** * 从匿名类到Lambda表达式的转变 */ @Test public void testLambdaHelloWorld() { // 匿名类01 new Thread(new Runnable() { @Override public void run()

JDK8新特性 Lambda表达式

一.接口的默认方法二.Lambda 表达式三.函数式接口四.方法与构造函数引用五.Lambda 作用域六.访问局部变量七.访问对象字段与静态变量八.访问接口的默认方法九.Date API十.Annotation 注解:支持多重注解 一.接口的默认方法 Java8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: [java] view plain copy public interface Formula { double calcu