在Java 8中可以调试Lambdas吗?



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

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

NetBeans附加调试器在"myListener"变量,但我不能进入EventListener本身,所以我不能看到里面发生了什么。

是否有调试信息缺失,这是NetBeans中缺失的功能,还是根本不可能在Java中调试Lambdas ?

它在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也-我建议你尝试它检查可以得到工作

使用以下示例代码在Netbeans 8 Release:

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);上设置一个断点,并检查值(i, l)非常好。

所以我倾向于说它是有效的

在IntelliJ中它也适用于我:

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

我可以调试到返回random.nextInt(),但只有当我提供一个终端操作,如count()

相关内容

  • 没有找到相关文章

最新更新