lambda及stream学习
今日板砖,见lambda,不知其然遂不以为意。后又数现之,于是乎查之,究之,学之。半晌,豁然开朗!
lambdalambda可以理解为一个匿名函数,可以将函数作为参数传入方法中,语法:() -> {}
():用来描述参数列表
->:lambda运算符
{}:用来描述方法体
对比
//1.原始创建线程方法Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("原始创建线程方法");
}
});
thread.start();
// new Thread()括号中存储的是实现了Runnable接口的一个匿名内部类;
//2. lambda创建线程方式
Thread thread1 = new Thread(()-> System.out.println("lambda线程方式"));
thread1.start();
//可以理解为,lambda创建了一个实现了Runnable接口的匿名内部类,()代表没有传递参数; System.out.println("lambda线程方式")是run()方法具体的逻辑;
lambda是针对函数式接口的一种快捷实例化方式,函数式接口为有且只有一个抽象方法的接口。使用lambda表达式,无需用对象实现接口,再继承重写抽象方法,直接通过()->{},传递参数,自定义逻辑,即可创建匿名内部类;
代码说明
无参无返回
/*** 测试无返回值无参数
*/
@FunctionalInterface
public interface LambdaNoRNoP {
void testNoRNop();
}
//无参无返回
LambdaNoRNoP lam1 = ()->{System.out.println("hello");};//创建一个匿名内部类,重写testNoRNop()方法
lam1.testNoRNop();
有参数有返回值
/*** 测试有返回值多个参数
*/
@FunctionalInterface
public interface LambdaRMulP {
int testRMulP(int a ,int b);
}
//有返回值,多个参数
LambdaRMulP lam6 = (int a ,int b )->{ return a+b; };
System.out.println(lam6.testRMulP(1,2));
代码精简
由于在接口的抽象方法中,已经定义了参数数量和类型,所以在lambda中,参数类型可以省略
如果只有一个参数,小括号可以省略
如果方法体中只有一条语句,大括号可以省略
//参数类型精简LambdaNoRMulP lam1 = (a,b)->{System.out.println(a);};
lam1.testNoRMulP(1,2);
//小括号精简
LambdaNoRSingleP lam2 = a -> {System.out.println(a);};
//大括号精简
LambdaNoRSingleP lam3 = a -> System.out.println(a); 方法引用
可以将lambda方法的实现,指向一个完整的方法,可以理解为解耦;
语法: 方法归属者::方法名
方法归属者:如果是静态方法,归属者就是类,如果是非静态方法,归属者就是对象。
要求:参数数量和类型一级返回值要和接口中定义的方法一致
public class Test{private static int change(int a){
return a*2;
}
}
LambdaRSingleP lam2 = a-> a*2;
//等同于
LambdaRSingleP lam1 = a-> change(a);//lambda的实现a*2和change()返回值一致,可以直接引用change(a)方法
//等同于
LambdaRSingleP lam3 =Test::change;//lambda表达式是传入一个int值,返回两倍的值,和Test类中的change方法逻辑一致,可以直接引用; stream学习
stream是java8中用来操作集合的,可以理解为另类的iterator,可以对其中元素进行操作。