Java Lambda表达式,
Java Lambda表达式,
Lambda表达式的概念
Lambda表达式用于代替匿名内部类的定义代码(此匿名内部类实现的接口是函数式接口)。
函数式接口:只有一个抽象方法的接口。
eg:
interface IntegerMath {
int operation(int a, int b);
}
Lambda表达式的好处
使用Lambda表达式的意义在于简化使用匿名内部类时编写的代码。
Lambda表达式与匿名内部类的比较如下:
匿名内部类:
IntegerMath addition = new IntegerMath() {
public int operation(int a, int b) {
return a + b;
}
};
Lambda表达式:
IntegerMath addition = (a, b) -> a + b;
Lambda表达式的语法
Lambda表达式由三部分构成:参数列表、->、主体
参数列表的完整定义:(类型 变量名[,类型 变量名...])
eg:(Integer a, Integer b)
主体:可以为单一表达式,也可以为{}包裹的代码块。
完整的Lambda表达式
(类型 变量名[,类型 变量名...])->expression or { expression; ...; }
eg:(Integer a, Integer b) -> a+b
Lambda的简化:
1.参数的类型可以省略,即只写变量名。
2.当只有一个参数时,可以省略包裹参数列表的括号。
notice:当使用主体为单一语句的Lambda表达式并且此语句是return语句时,需要使用{}。
eg:
IntegerMath addition = { return (a, b) -> a + b; };
Lambda的作用域
Lambda可以访问传入的参数。
Lambda可以访问使用该Lambda表达式的方法内的本地变量与参数,但是这些变量必须为final或表现为final(不可改变)。
Lambda的作用域与使用Lambda表达式的方法相同,即Lambda不会引入新的嵌套块,即使形式上使用了{}。所以,Lambda参数名不能与本地变量名重复。
Lambda的常见应用场景
jdk定义了部分常用的function interface,位于java.util.function包下。
比较常用的接口有:
Predicate、Function、Consumer
Predicate接口内置test方法,boolean test(T t)。一般用于编写对参数值的判断逻辑,eg:判断传入的Integer值是否大于50。
Function接口内置apply方法,R apply(T t)。一般用于编写对参数值的处理转化逻辑,eg:将传入的Integer值+100后返回。
Consumer接口内置accept方法,void accept(T t)。一般用于编写对参数值的处理逻辑。eg:将传入的Integer值输出至控制台。
函数式编程主要应用在对集合数据的处理上。
通过使用Collection的stream()方法返回一个Stream,然后使用Stream接口内定义的方法,对集合内元素进行处理。
eg:
list.stream().filter(n->n<50).map(n->n+300).forEach(n->System.out.println(n));
note:将list中小于50的Integer全部+300,然后逐个输出到控制台。
filter,对集合内的元素全部使用传入的实现Predicate的Lambda进行筛选,符合条件的留下,将经过筛选集合的Stream返回。上述语句中,将list中小于50的Integer选出。
map,对集合内的元素全部使用传入的实现Function的Lambda表达式进行处理,并将返回结果转化为新的Stream。上述语句中,将filter处理后的Stream中的元素全部+300。
forEach,对集合内的元素全部使用传入的实现Consumer的Lambda表达式进行处理,并将返回结果转化为新的Stream。上述语句中,将map处理后的Stream中的元素全部输出到控制台。
更详细的教程
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
相关文章
- 暂无相关文章
用户点评