Lambda表达式,(布兰达)λ表达式,也可称为闭包。
java8发布的最重要的新特性。
Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
Lambda表达式使用:
// 不需要参数
() -> 5
// 当有两个参数时需要有小括号,返回两个传参直接的差值
(x, y) -> x – y
// 一个参数时可以不需要小括号,返回传参的5倍
x -> 5 * x
应用(使用jdk1.8以上版本):
public class Java8Tester{
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
// 类型声明
MathOperation addition = (int a, int b) -> a + b;
// 函数式编程 1
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
// 函数式编程的另一种写法 2
System.out.println("10 + 5 = " + tester.operate(10, 5, new MathOperation(){
@Override
public int operation(int a, int b){
return a+b;
}
}));
// Lambda表达式写法 3
System.out.println("10 + 5 = " + tester.operate(10, 5, (a, b) -> a+b));
System.out.println("10 + 5 = " + addition.operation(10,5));
// 不用括号
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
// 用括号
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
greetService1.sayMessage("Runoob");
greetService2.sayMessage("Google");
}
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
Lambda表达式写法3与写法2是完全同样的含义,Lambda只是把复杂的写法简化了。
再看一个函数式编程的使用:
package cn.tanzhou.ocean.main;
import com.google.common.collect.Lists;
import java.math.BigDecimal;
import java.util.List;
public class Java8Tester {
public static void main(String args[]){
Java8Tester tester = new Java8Tester();
tester.getData(null);
}
public interface TrendCall {
List<BigDecimal> execute(String param);
}
public List<BigDecimal> getData(String param) {
SelectExecutor selectExecutor = new SelectExecutor();
List<BigDecimal> execute = selectExecutor.execute(new TrendCall() {
@Override
public List<BigDecimal> execute(String param) {
return service(param);
}
}, param);
// List<BigDecimal> execute = selectExecutor.execute(param1 -> service(param1), param);
System.out.println(execute);
return execute;
}
public List<BigDecimal> service(String param){
List<BigDecimal> list = Lists.newArrayList();
System.out.println(param);
list.add(BigDecimal.ZERO);
return list;
}
public class SelectExecutor{
public List<BigDecimal> execute(TrendCall trendCallback, String param) {
List<BigDecimal> list ;
list = trendCallback.execute(param);
return list;
}
}
}
在java8的新特性中,可以把函数作为一个方法的参数:SelectExecutor中的execute方法其中一个参数是一个接口。
在注释中可以使用Lambda表达式写法简化成:
List<BigDecimal> execute = selectExecutor.execute(param1 -> service(param1), param);