可以在Java8中调试Lambdas吗
我刚开始使用Java8Lambdas,我注意到我无法在NetBeansIDE中调试它们。如果我尝试将断点附加到以下代码,我会得到一个变量断点,它肯定不是我想要的:可以在Java8中调试Lambdas吗,java,debugging,netbeans,lambda,java-8,Java,Debugging,Netbeans,Lambda,Java 8,我刚开始使用Java8Lambdas,我注意到我无法在NetBeansIDE中调试它们。如果我尝试将断点附加到以下代码,我会得到一个变量断点,它肯定不是我想要的: private EventListener myListener (Event event) -> { command1; command2; // Set Breakpoint here command3; }; NetBeans在“myListener”变量处附加了调试器,但我无法进入EventListener
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中也适用-我建议您尝试一下,以检查是否可以正常工作。在IntelliJ中,它也适用于我:
Stream.generate(() -> {
return random.nextInt();
}).limit(10).count();
我可以调试到返回的
random.nextInt()
中,但只有在提供类似count()
的终端操作时才可以 使用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);
});
}
private void init(){
List mapList=new ArrayList();
Map map1=新的HashMap();
map1.put(1,“String1”);
mapList.add(map1);
Map map2=新的HashMap();
map2.put(2,“String2”);
mapList.add(map2);
Map map3=新的HashMap();
map3.put(1,“第3条”);
地图列表。添加(地图3);
Map map4=新的HashMap();
map4.put(2,“String4”);
mapList.add(map4);
Map response=mapList.stream()
.flatMap(map->map.entrySet().stream())
.收集(
收集者分组(
Map.Entry::getKey,
图(
Map.Entry::getValue,
收集者
)
)
);
响应。forEach((i,l)->{
System.out.println(“整数:+i+”/列表:+l);
});
}
我可以在System.out.println(“Integer:+I+”/List:+l”)上设置断点编码>并检查值(i
,l
)非常好
所以我倾向于说它正在工作。作为确认,您是否使用Netbeans 8运行?可能是Netbeans 7.4也支持Java 8。是的,我使用Netbeans 8只是为了您(和其他人)的信息,此代码可以写成new Random().ints(10)
来生成IntStream
,因此总代码可以是new Random().ints(10).count()
,我知道,虽然没有lambda表达捕捉将是目前的。工程为我,谢谢你的答案。但是我的问题和Jon Skeet的回答一样。@Jeroenvanevel:你是用strg+f8设置断点还是通过点击行号设置断点?它似乎与strg+f8一起工作,但与行号无关,因此它可能是一个错误,或者我的设置被破坏了…对我来说很有效,谢谢你的回答。但我和Jon Skeet的回答有同样的问题。