lambda及stream学习

lambda及stream学习

今日板砖,见lambda,不知其然遂不以为意。后又数现之,于是乎查之,究之,学之。半晌,豁然开朗!

lambda

lambda可以理解为一个匿名函数,可以将函数作为参数传入方法中,语法:() -> {}

():用来描述参数列表

->: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,可以对其中元素进行操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzywxw.html