Theme NexT works best with JavaScript enabled
0%

Java Lambda

^ _ ^

Lambda表达式

为什么需要lambda表达式?

当我们实现只定义了一个方法的接口时,使用匿名类可能会看起来比较笨重。如下段代码所示,匿名类需要6行代码实现的功能,使用lambda表达式后只需要一行代码。所以,Lambda表达式是为了简化只有一个方法接口的实现而提出的特性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class AnonymousVersusLambda {
void invokeInterface(InterfaceWithOneMethod myInterface){
myInterface.func();
}

public static void main(String[] args){
AnonymousVersusLambda test = new AnonymousVersusLambda();
test.invokeInterface(new InterfaceWithOneMethod(){
@Override
public void func(){
System.out.println("匿名类重写的func");
}
});

test.invokeInterface(()->{System.out.println("Lambda重写的func");});
test.invokeInterface(()->System.out.println("简化版的Lambda重写func"));
}
}

interface InterfaceWithOneMethod{
void func();
}

Lambda表达式如何使用

  1. 定义只有一个方法的接口,不妨设为返回值 方法名(参数列表)
  2. 通过lambda表达式定义该接口方法的实现:接口 = (参数列表)->{实现代码}

实现一个泛型接口为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class GenericLambda {
public static void main(String[] args){
GenericInterface<String,Boolean,Double> interface1 = (Boolean a,Double b)->{
System.out.println("" + a + b);
return "success";
};
System.out.println(interface1.printObj(true, 2.51));
}
}

interface GenericInterface<T,E,U>{
T printObj(E Obj1,U Obj2);
}

函数式接口

函数式接口指只定义了一个方法的接口。Jdk1.8在java.util.function包中提供了大量函数式接口。我们可以在特定情况下联合使用这些接口和lambda表达式,这样就不需要自己定义接口了。
所有的函数式接口都用@FunctionalInterface进行注解。

1. Consumer接口

消费型接口,拥有一个输入参数,无返回值。

1
2
3
4
Consumer<Person> myConsumer = (p)->{
System.out.println(p);
};
myConsumer.accept(person);

2. Supplier接口

生产型接口,无输入参数,有一个返回值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static Person createPerson(){
String[] familys = {"Carmelon", "Lily", "Michael", "Jay", "Many", "Goloria", "Joy",
"Bufy", "Alex", "Hairy", "Luke", "Calair"};
Sex[] sexes = {Sex.MALE, Sex.FEMALE};
int[] ages = {40, 5, 40, 65, 14, 35, 1, 42, 16, 18, 14, 40};

Supplier<Person> mySupplier = ()->{
Random random = new Random();
int index = random.nextInt(familys.length);
return new Person(familys[index], sexes[random.nextInt(2)], ages[index], familys[index] + "@yahoo.com");
};

return mySupplier.get();
}

3. Predicate接口

检测型接口,拥有一个输入参数,返回值为布尔类型。

1
2
3
4
5
6
7
8
Predicate<Person> myPredicate = (p)->{
return p.age > 10 && p.age < 20;
};
for(Person person: persons){
if(myPredicate.test(person)){
System.out.println(person);
}
}

4. Function接口

函数型接口,拥有一个输入参数,一个返回值。

1
2
3
4
5
Function<Person,Integer> myFunction = (p)->{
p.age = p.age + 1;
return p.age;
};
int newAge = myFunction.apply(person);

流式编程

参考资料

Java Tutorial : https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html