IDEA 下,老司机教你如何 debug lambda

2021-12-07 20:24:29 浏览数 (1)

发表于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 的调试原来可以如此简单。

0 人点赞