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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值