lambda study

lambda

1.lambda的基本格式

  • (parm1,parm2,…) -> {TODO} 其中参数可以为空,即用()表示,()->{TODO},只有一个参数时()可以省略,如:e->{TODO} 其中->右边,如果只有一条语句可以省略{},当有多条语句时,需要使用{}. 单条语句:
1
()->System.out.println("hello world");(注意要加分号)

多条语句:

1
2
3
4
()->{
  System.out.println("hello world");
  System.out.println("hello world");
};(注意这里也要加分号)

我们这里写的

什么时候可以使用lambda呢

当我们有一个接口,并且这个接口只有一个方法(这里说的不太准确,下面会进行说明),比如:

1
2
3
public interface MyInterface{
  void helloWorld(String s);
}

这是只有一个接口的方法,然后我们我们可以这样使用它:

1
2
MyInterface demo = e->System.out.println(e);
demo.helloWorld("hello world!");

当然接口里的方法可能有时不止一个,比如以下情况:

  • 情况1,接口中有default修饰的方法是不影响lambda的使用:
1
2
3
4
5
6
public MyInterFace{
  void helloWorld(String s);
   default void test(Integer i){
    System.out.println("i的值为:" + i);
  }
}

default修饰符也是java8加的新特性,但是他修饰的必须有方法体,感觉和抽象类有些相似。

  • 情况2,接口中有static修饰的方法
1
2
3
4
5
6
public MyInterFace{
  void helloWorld(String s);
  static void test2(String s){
       System.out.println(s);        
  }
}

使用static和default一样都需要有方法体。

一般我们要是定义一个函数式编程接口时,最好加一个’@FunctionInterface’这个注解,他标明了这个接口是一个函数式接口,当该接口的方法多于一个的时候,会提示报错。

用例子可能更好理解

1
2
3
4
5
6
7
8
9
10
List<String> list = Arrays.asList("aaa","bbb","ccc","ddd");
//传统方式
list1.forEach(new Consumer(){
            @Override
            public void accept(Sring s) {
                System.out.println(s);
            }
        });
//lambda方式
list.forEach(e->System.out.println(e));

我们分析一下为什么可以这样用 通过传统方式看出我们需要实现accept()这个接口,这个接口需要一个参数所以我设了一个e(这个参数任意起名字),接口需要有一个具体操作,因为我们想将list的每一项输出,所以加了一句System.out.println(e).可以看出我们需要做的就是实现这个接口的方法体。