Java/Eclipse:“Lambda表达式不能用于评估表达式”。

19
我写了以下的Lambda表达式。
int size = ((List<?>) receipt.getPositions().stream().filter(item -> true).collect(Collectors.toList())).size()

变量size计算正确!但是当我尝试检查它(Ctrl+Shift+I)或尝试在Eclipse表达式视图中查看表达式的结果时,我会收到以下错误提示:“无法在评估表达式中使用Lambda表达式”。

enter image description here

除了将表达式存储到变量中之外,是否有其他机会查看其结果?

附注:我正在使用Java 8和Eclipse neon.2


1
如果您使用互联网搜索引擎,将会找到关于“Lambda表达式不能在评估表达式中使用”的错误信息的一些信息。基本答案是否定的,但也许将来会有所改变。 - Patrick Parker
2
另外,为什么不直接使用count()而不是collect(...).size()呢? - Patrick Parker
只需使用 receipt.getPositions().size()。这可以在调试器中轻松评估,没有问题。 - Holger
1
仅供参考和后续使用:在jdt中似乎存在这个bug:https://bugs.eclipse.org/bugs/show_bug.cgi?id=448473 - timguy
1
你需要将Eclipse升级到IntelliJ :p的版本。 - ihebiheb
1个回答

2
一个简单的解决方案是将您的lambda表达式转换为匿名类创建。创建所需接口的变量,您将获得一个可调试的表达式。
    Predicate<Object> predicate = new Predicate<Object>() {
        @Override
        public boolean test(Object item) {
            return true;
        }
    };
    int size = ((List<?>) receipt.getPositions().stream().filter(predicate).collect(Collectors.toList())).size();

现在,如果你正在调试时停留在“int size = ...”这行代码,你可以查看以下操作的结果:

((List<?>) receipt.getPositions().stream().filter(predicate).collect(Collectors.toList())).size()

我希望这能有所帮助 :)

这对于原始问题有效,但如果您尝试在详细格式化程序或调试视图中编写lambda,则无法帮助您。您不能创建自己的谓词,因为您将获得“无法在评估表达式中使用匿名类型声明/无法在评估表达式中使用本地类型的构造函数”。恐怕您只能使用常规的Java逻辑。 - Noumenon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接