我刚开始玩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();
}
}
我可以在r1
和r2
内的单个行中添加断点,并且它们得到适当的命中,采用步进等。
如果我在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()
。