Lambda表达式
lambda表达式是是一个匿名函数,即没有函数名的函数
举个我们平时创建线程的栗子
1 | java复制代码 //Runnable实现类 |
优点
:lambda表达式相比传统的Runnable对象作为参数传递给Thread类方式创建线程的方式,代码更简洁
方法引用
方法引用可以将一个方法封装成一个变量。::双冒号是方法引用的符号
1 | java复制代码 //方法引用,将字符串100转换成Integer类型 |
方法引用的返回值类型是函数式接口
被引用方法的参数个数,类型,返回值类型需要和函数式接口中方法的声明一致,只要满足这个要求,可以返回任意类型的函数式接口
1 | java复制代码 //Function函数式接口,apply方法接收T类型的变量,返回R类型的结果 |
在java.util.function包下有很多函数式接口
自定义一个函数式接口
1 | csharp复制代码 //函数式接口的run方法会接收T和S类型两个参数,返回R类型的结果 |
自定义一个和KiteFunction的run方法队对应的方法
1 | typescript复制代码 //dateFormat方法的功能是按照指定的格式,把日期进行格式化,返回字符串的日期 |
1 | ini复制代码 KiteFunction<LocalDateTime, String, String> dateFormat = TimeConverse::dateFormat; |
如果TimeConverse的dateFormat方法只会被调用一次,我们也可以直接将其在kiteFunction接口的run方法中实现(原理类似于Runnable接口创建启动一个新线程),这种是匿名内部类的方式
1 | typescript复制代码 String dateStr2 = new KiteFunction<LocalDateTime, String, String>() { |
上面匿名内部类可以使用lambda表达式的形式进行替代
1 | ini复制代码 String dateStr2 = ((KiteFunction<LocalDateTime, String, String>) (localDateTime, pattern) -> { |
Stream流
Stream流中大量运用了方法引用和lambda表达式,并提供了很多简单易用封装好的工具API,使用这些API我们可以快速高效地对复杂数据进行处理
- flatMap 对多维数据进行扁平化处理
- peek函数类似于foreach函数,区别是foreach函数执行后没有返回结果,而peek返回了Stream,但是如果执行peek函数后,没有对数据进行收集操作,peek函数内部的方法不会被执行
- reduce函数,对数据进行累加操作
1 | java复制代码 //reduce方法定义 |
Stream流程常用方法
1 | java复制代码 Trader raoul = new Trader("Raoul", "Cambridge"); |
总结
我们平时说的函数式编程,
函数
即方法引用,式
即Lambda表达式
Stream流可以提高我们的编程效率,但是也需要合理的使用StreamAPI,涉及到复杂的业务逻辑时需要写好注释
本文转载自: 掘金