可以在Java8中调试Lambdas吗

可以在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

我刚开始使用Java8Lambdas,我注意到我无法在NetBeansIDE中调试它们。如果我尝试将断点附加到以下代码,我会得到一个变量断点,它肯定不是我想要的:

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的回答有同样的问题。