一.简介

Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

二.基本写法

Lambda 表达式是接口或者是接口函数的简写。
(参数)-> 结果
如:(String s) -> s.length
如:x-> x*x
如:()-> {System.out.println(“Hello World.”);}
它就相当于其他语言里面的一个“匿名函数”或者“函数指针”,在java中实际上是“匿名类的一个实例”。

1.一个 Lambda 表达式可以有零个或多个参数
2.参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
3.所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
4.空圆括号代表参数集为空。例如:() -> 42
5.当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
6.Lambda 表达式的主体可包含零条或多条语句
7.如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
8.如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

三.常用写法

Operation.java

1
2
3
4
5
6
7
8
package com.devnp;

@FunctionalInterface
public interface Operation {

public void doIt(Integer a, String b);

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package com.devnp;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class LambdaDemo1 {

public static void main(String[] args) {

//Lambda 表达式及其函数式接口
Consumer<Integer> c = (Integer x) -> { System.out.println(x) ;};

c.accept(5);

BiConsumer<Integer, String> b = (Integer x, String y) -> System.out.println(x + " : " + y);

b.accept(10, "Hello World.");

execute(10, "Hello", new Operation() {
@Override
public void doIt(Integer a, String b) {
System.out.println(a + ":" + b + "," + "Worker invoked using Anonymous class");
}
});

Operation operation = (Integer index, String str) -> {System.out.println(index + ":" + str);System.out.println("Worker invoked using Lambda expression");};

execute(11, "world", operation);

//使用lambdas 来实现 Thread
new Thread(() -> {System.out.println("Hello World.");}).start();

//forEach
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7);

list.stream().map((x) -> x*x).forEach(System.out::println);

//order 排序
String [] arraysStr = {"Z", "A" ,"Y"} ;
Comparator<String> sortByName = (String s1, String s2) -> (s1.compareTo(s2));

Arrays.sort(arraysStr, sortByName);

for (String string : arraysStr) {
System.out.print(string);
}
}

private static void execute(Integer a, String b, Operation operation) {
// TODO Auto-generated method stub
operation.doIt(a, b);
}

}

四.使用条件

由于Lambda只能表示一个函数,所以,能写成Lambda的接口要求包含且最多只能有一个抽象函数,这样的接口可以使用@FunctionalInterface来表示,这样称之为函数式接口。

参考
https://www.coursera.org/learn/java-chengxu-sheji/lecture/eHjdD/5-6-lambdabiao-da-shi-lambdabiao-da-shi-jiao-gao-yao-qiu