我刚刚开始使用Java 8 Lambdas,我注意到我无法在NetBeans IDE中调试它们。如果我尝试将断点附加到以下代码,我会得到一个变量断点,这绝对不是我想要的:
private EventListener myListener (Event event) ->
{
command1;
command2; // Set Breakpoint here
command3;
};
NetBeans将调试器附加到“myListener”变量,但我无法进入EventListener本身,因此我无法看到其中发生的事情。
是否缺少调试信息,这是NetBeans中缺少的功能还是完全无法在Java中调试Lambdas?
答案 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();
}
}
我可以在r1
和r2
中的各个行添加断点,并且可以通过步进等方式适当地命中它们。
如果我只在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);
上设置断点并完全检查值(i
,l
)。
所以我倾向于说它有效。
答案 2 :(得分:2)
在IntelliJ中它也适用于我:
Stream.generate(() -> {
return random.nextInt();
}).limit(10).count();
我可以调试返回random.nextInt()
,但仅当我提供像count()
这样的终端操作时。