lambda表达式浅析

本篇将告诉你lambda是什么,并且简单举例示意。

lambda是什么?

  • lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的匿名函数。 (注意:lambda 函数不能包含命令,它们所包含的表达式也不能超过一个)

  • lambda函数比较轻便,即用即扔,很适合需要完成某一项简单功能,但是这个简单的功能只在此一处使用,连名字都很随意的情况下;

  • lambda是匿名函数,一般用来给filter,map,reduce这样的函数式编程服务;

  • 作为回调函数,可以传递给某些应用,比如消息处理等。

举一个lambda应用非常简单的栗子:

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
@Data
class Person {
private int age;
private String name;
private String firstName;
private String gen;
}


public static List<Person> getPersons(int personNum) {
String[] firstName = {"孙","上官","刘","李","赵","李","王","张"};
String[] endName = {"宏强","三","四","壁咚","古来","八戒","恒达"};
List<Person> personList = new ArrayList<>();
for (int i = 0; i < personNum - 1; i++) {
int findex = new Random().nextInt(firstName.length);
int eindex = new Random().nextInt(endName.length);
int age = (findex + 1) * (eindex +1);
Person person = new Person();
person.setAge(age);
person.setName(endName[eindex] + firstName[findex]);
person.setFirstName(firstName[findex]);
person.setGen(age % 3 ==0?"男":"女");
personList.add(person);
}
return personList;
}

用上面person作为集合元素,求出集合中男的人数有多少,简单吧,来:

1
2
3
4
5
6
7
8
9
 List<Person> persons = getPersons(14);
int count = 0;

Iterator<Person> iterator = persons.iterator();
while (iterator.hasNext()) {
Person next = iterator.next();
if (next.getGen().equals("男"))
count++;
}

或者使用for循环直接遍历等等,既然说lambda,我们看一下lambda结合stream的写法:

1
long count1 = persons.stream().filter(x -> x.getGen().equals("男")).count();

so beautiful!不太理解是吧,来更深入一点看看一个自定义的函数式编程规范:

自定义一个实例

1
2
3
4
5
6
7
8
9
@FunctionalInterface//函数式接口检查注解 只能存在一个抽象方法
public interface WorkerInterface<T> {

boolean doSomeWork(T t);
//取反
default WorkerInterface<T> workTest() {
return t -> !doSomeWork(t);
}
}

首先要明白函数式接口只允许接口内有一个抽象方法,那么,static和default修饰的还是可以存在的。至于@FunctionalInterface注解,它的作用如下:

1、该注解只能标记在”有且仅有一个抽象方法”的接口上。

2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。

3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。

4、该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。

还没完,上最后代码,还是关于lambda的简单应用:

1
2
3
4
5
6
7
public class WorkerInterfaceTest {

public static void main(String[] args) {
WorkerInterface<Integer> a = x -> x < 6;
System.out.println(a.doSomeWork(5));
System.out.println(a.workTest().doSomeWork(5));
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!