发表于2019-03-192020-03-03 作者 Ryan
目前程序员市场环境下,Java 党的 lamda 语法已经无处不在,比如大家熟悉的 Spring 5.x 框架,lambda 满天飞啊!
这里说一下,为什么要玩 lambda 这种写法, 他与面向对象有什么不同。
1. 面向对象的编写方法,是程序员死命的敲击键盘告诉计算机,它要做什么,先做什么后做什么; 2. 而 lambda 是程序来告知程序员它先要做什么,后要做什么; 3. lambda 的写法可以减少你敲击键盘的次数,让你有更多的时间可以端起 coffe;
lamda 的语法和方式我这里就不在说明了,读者有兴趣可以直接阅读 《Java 8 实战》这本书,有详细的说明,或者阅读官方文档;
说明一下:
- windows 7
- oracle hotspot jdk 1.8
- InteliJ IDEA 2018.1.5
- Apache Maven 3.3.3
下面,我们从一个示例说起。我们要使用Java 8 中的 lambda 语法,首先需要保证我们新建的项目 language level 8 以上才行。如下图
以上两项必须确保是是 8 ,否则不会达到预期的功能及效果。
接下来,新建一个 Student 示例类,代码如下:
代码语言:javascript复制private static class Student{
private String id;
private String name;
private int age;
private boolean graduation;
public Student(String id, String name, int age, boolean graduation) {
this.id = id;
this.name = name;
this.age = age;
this.graduation = graduation;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isGraduation() {
return graduation;
}
public void setGraduation(boolean graduation) {
this.graduation = graduation;
}
@Override
public String toString() {
return "Student{"
"id='" id '''
", name='" name '''
", age=" age
", graduation=" graduation
'}';
}
}
接下来,编写我们的程序主类,如下图:
代码语言:javascript复制public static void main(String[] args) {
List<String> data = new ArrayList<String>();
data.add("1,Ryan,25,true");
data.add("2,zhangsan,22,false");
data.add("3,lisi,18,false");
data.add("4,wangwu,35,true");
data.add("5,liliu,20,false");
Set<String> collect = data.stream().map(d -> {
String[] split = d.split(",");
return new Student(split[0], split[1], Integer.parseInt(split[2]), Boolean.parseBoolean(split[3]));
}).filter(Student::isGraduation).map(Student::getName).collect(Collectors.toSet());
System.out.println(collect);
}
说明一下,这里主要是针对学生的数据进行解析,并过滤出已经毕业的学生,获取他们的姓名,最后输出;
在这里,我们先要对 Lambda 进行调试,打上 断点,一个 F8 可能就过去了,根本看不到 .map(Student::getName) 的结果,这个时候怎么办?也有可能遇到类似笔者这样尴尬的事情(不是语句,好尴尬呀!):
我们要针对 lambda 进行调试, IDEA 为我们提供了一个友好的方式,那就是“Trace Current Stream Chain”, 这个功能,在 debug 的 Tab 中,如下图所示:
我们直接点击它即可,如果你的 IDEA 下,不存在这样的功能,务必检查自己的 IDEA 版本。点击之后需要稍微等一会儿,会出现类似笔者的画面:
如果你留意的话,可以看到 左下角的 “Split Mode”进行切换显示,lambda 的每一步操作及结果都能够显示在这里,一目了然,是不是很人性化!
lambda 的调试原来可以如此简单。