是否可以在Java 8中调试Lambdas

时间:2014-03-20 11:49:36

标签: java debugging netbeans lambda java-8

我刚刚开始使用Java 8 Lambdas,我注意到我无法在NetBeans IDE中调试它们。如果我尝试将断点附加到以下代码,我会得到一个变量断点,这绝对不是我想要的:

private EventListener myListener (Event event) ->
{
  command1;
  command2; // Set Breakpoint here
  command3;
};

NetBeans将调试器附加到“myListener”变量,但我无法进入EventListener本身,因此我无法看到其中发生的事情。

是否缺少调试信息,这是NetBeans中缺少的功能还是完全无法在Java中调试Lambdas?

3 个答案:

答案 0 :(得分:5)

它适用于Eclipse。例如:

public class Foo {

    private static final Runnable r1 = () -> {
        System.out.println("r1a");
        System.out.println("r1b");
    };

    public static void main(String[] args) {
        Runnable r2 = () -> {
            System.out.println("r2a");
            System.out.println("r2b");
        };

        r1.run();
        r2.run();
    }
}

我可以在r1r2中的各个行添加断点,并且可以通过步进等方式适当地命中它们。

如果我只在run()次调用上设置断点,我也可以将转换为相关的lambda表达式。

所以听起来至少的所有调试信息都可以可用。

编辑:显然上述内容也适用于Netbeans - 我建议您尝试检查是否能够正常运行。

答案 1 :(得分:3)

使用 Netbeans 8发布中的以下示例代码:

private void init() {
    List<Map<Integer, String>> mapList = new ArrayList<>();

    Map<Integer, String> map1 = new HashMap<>();
    map1.put(1, "String1");
    mapList.add(map1);

    Map<Integer, String> map2 = new HashMap<>();
    map2.put(2, "String2");
    mapList.add(map2);

    Map<Integer, String> map3 = new HashMap<>();
    map3.put(1, "String3");
    mapList.add(map3);

    Map<Integer, String> map4 = new HashMap<>();
    map4.put(2, "String4");
    mapList.add(map4);

    Map<Integer, List<String>> response = mapList.stream()
            .flatMap(map -> map.entrySet().stream())
            .collect(
                    Collectors.groupingBy(
                            Map.Entry::getKey, 
                            Collectors.mapping(
                                    Map.Entry::getValue, 
                                    Collectors.toList()
                            )
                    )
            );
    response.forEach((i, l) -> {
        System.out.println("Integer: " + i + " / List: " + l);
    });
}

我可以在System.out.println("Integer: " + i + " / List: " + l);上设置断点并完全检查值(il)。

所以我倾向于说它有效。

答案 2 :(得分:2)

在IntelliJ中它也适用于我:

Stream.generate(() -> {
    return random.nextInt();
}).limit(10).count();

我可以调试返回random.nextInt(),但仅当我提供像count()这样的终端操作时。