//
这是一篇从入门到进阶的lambda表达式的学习,罗列知识点较为齐全,适合作为参考
1、基础语法(参数列表、方法体)
//lambda本质上是匿名函数,不关心方法名,返回值类型。lambda只在意参数列表和方法体本身,并通过->连接两者
// () -> {}
// 我这里先定义了如下四个接口(他们的参数和返回值不同),用他们来说明lambda具体使用时的区别
LambdaNoneReturnMutipleParameter lambda2 = (int a,int b)->{System.out.println(a+b);};
LambdaNoneReturnNoneParameter lambda1 = ()->System.out.println();//如果方法体只有一条语句,可以省略大括号;
LambdaSingleReturnSingleParameter lambda3 = a->1;//如果接口中参数只有一个,可以省略括号。
//如果方法体只有一条返回值语句,省略大括号;和return
LambdaSingleReturnMutipleParameter lambda4 = (a,b)->{return a+b;};//因为接口中已经定义了参数类型,可以省略
//lambda里方法的引用:将lambda实现指向一个已实现的方法(解决lambda重复使用)
LambdaSingleReturnSingleParameter lambda5 = a->change(a);//普通方法的引用
LambdaSingleReturnSingleParameter lambda6 = TestLambda::change;//静态方法的引用
//这里定义了一个person类
PersonCreater creater = Person::new;//构造器的引用
Person p = creater.getPerson("yyy",18);
//在集合中的使用,一般是继承Comparator接口
List<Integer> list = new ArrayList<>();
TreeSet<Integer> set = new TreeSet<>( (o1,o2) -> o1-o2 );
Collections.sort(list, (o1,o2)->{
if(o1>o2) {
return 1;
}else {
return -1;
}
});//如果o1比o2大就交换,实现list降序排列
list.removeIf( ele -> ele>10 );//返回值为true则删除该元素
//在线程中的使用
new Thread(()-> {
for(int i=0;i<20;i++) {
System.out.println("数字数到:"+i);
}
}).start();
2、系统内置的一些函数式接口(常用的有Predicate,Consumer,Supplier, Function)
/**
* BiPredicate<T,U> 参数T,U,返回值boolean
* Predicate<T> 参数T,返回值boolean
* IntPredicate 参数int,返回值boolean
* LongPredicate 参数long,返回值boolean
* DoublePredicate 参数double,返回值boolean
*/
/**
* BiConsumer<T,U> 参数T,U,返回值void
* Consumer<T> 参数T,返回值void
* 其余拓展同Predicate
*/
/**
* Supplier<T> 无参, 返回值T
* ...
*/
/**
* Function<T,R> 参数T,返回值R
* UnaryOperator 参数T,返回值T(继承自Function)
* IntFunction<R> 参数int,返回值R
* LongFunction<R> 参数long,返回值R
* DoubleFunction<R> 参数double,返回值R
* IntToLongFunction 参数int,返回值long
* ...
*/
/**
* BiFunction<T,U,R> 参数T,U,返回值R
* BinaryOperator<T> 参数T,T,返回值T(继承自BiFunction)
*/
3、闭包
作用:提升变量的生命周期,可以获取方法中的局部变量
在闭包中引用局部变量,系统使该变量为常量
private static Supplier<Integer> getNumber(){
int num=10;
return ()->{
return num; //在这个get方法中本来没办法获取到num的值
};
}
public static void main(String[] args){
int n = getNumber().get();
}
需要注意的是,lambda写在方法体内的参数会被系统默认为final,不能从方法体内改变外部变量的值