> 文章列表 > Java8特性之Lambda表达式

Java8特性之Lambda表达式

Java8特性之Lambda表达式

1.概念

lambda表达式是Java8的一个新特性,从本质上来讲是一个匿名函数可以使用这个匿名函数实现接口中的方法,并且非常简洁。

通常来讲,使用 lambda表达式 是为了简化接口实现的。关于接口实现,可以有很多种方式来实现。例如L设计接口的实现类、使用匿名内部类。但是lambda表达式比这两种方式都简单。

2.Lambda表达式对接口的要求

并不是所有的接口都可以使用lambda表达式来简洁实现的。lambda表达式毕竟只是一个匿名方法。当实现的接口中的方法过多或者过少的时候,lambda表达式都是不适用的。

lambda表达式只能实现函数式接口。即一个接口中,要求实现类必须实现的抽象方法,有且只有一个,这样的接口就是函数式接口。

 

 

3.Lambda表达式的语法

(参数)->{方法体}
  • 参数部分︰方法的参数列表,要求和实现的接口中的方法参数部分一致,包括参数的数量和类型
  • 方法体部分∶方法的实现部分,如果接口中定义的方法有返回值,则在实现的时候,注意返回值的返回。
  • ->:分隔参数部分和方法体部分。 

 

  • 因为接口中规定了方法参数类型,所以实际写lambda表达式的时候可以省略 参数类型。如果只有一个参数,可以省略()
  • 另外如果方法体里只有一个语句,那么可以省略掉 {},如果该语句是return语句,需要把return也省略掉

省略如下:

4.函数引用

lambda表达式是为了简化接口的实现的。在lambda表达式中,不应该出现比较复杂的逻辑。如果在lambda表达式中出现了过于复杂的逻辑,会对程序的可读性造成非常大的影响。

如果在lambda表达式中需要处理的逻辑比较复杂,一般情况会单独的写一个方法。在lambda表达式中直接引用这个方法即可。或者,在有些情况下,我们需要在lambda表达式中实现的逻辑,在另外一个地方已经写好了。此时我们就不需要再单独写一遍,只需要直接引用这个已经存在的方法即可。

函数引用:引用一个已经存在的方法,使其替代lambda表达式完成接口的实现。

4.1引用一个静态方法

接口依然是上面的MultipleParametersReturn,引用如下 

需要注意的是引用的 方法的参数返回值类型 要与 接口 对应

4.2引用一个非静态方法

4.3引用构造方法 

Person类

public class Person {private Integer age;private String name;public Person() {}public Person(Integer age) {this.age = age;}public Person(Integer age, String name) {this.age = age;this.name = name;}@Overridepublic String toString() {return "Person{" +"age=" + age +", name='" + name + '\\'' +'}';}
}

PersonWithNoParam接口

@FunctionalInterface
public interface PersonWithNoParam {Person getPersonWithNoParam();
}

PersonWithOneParam接口

@FunctionalInterface
public interface PersonWithOneParam {Person getPersonWithOneParam(Integer age);
}

PersonWithDoubleParams接口

@FunctionalInterface
public interface PersonWithDoubleParams {Person getPersonWithDoubleParams(Integer age,String name);
}

Demo

public class Demo1 {public static void main(String[] args) {//lambda表达式实现PersonWithNoParam接口PersonWithNoParam t1=Person::new;//无参构造函数引用System.out.println(t1.getPersonWithNoParam());//lambda表达式实现PersonWithOneParam接口PersonWithOneParam t2=Person::new;//单参构造函数引用System.out.println(t2.getPersonWithOneParam(10));//lambda表达式实现PersonWithDoubleParams接口PersonWithDoubleParams t3=Person::new;//多参构造函数引用System.out.println(t3.getPersonWithDoubleParams(10,"小王"));}}

lambda表达式会自动根据 方法的参数类型 匹配Person类中对应的构造方法