为何Lambda表达式在调用实现前就已被求值?
致谢:示例来自Boyarsky和Selikoff所著的《OCP Java 17认证指南》
为了吃透Lambda表达式,我在IntelliJ IDE里给代码加了断点,一步步调试。
Function<Integer, Integer> before = x -> x + 1; Function<Integer, Integer> after = x -> x * 2; Function<Integer, Integer> combinedf = after.compose(before); System.out.println(combinedf.apply(3));
调试时我发现x已经被赋值了。继续单步执行到下一行,居然在调用combinedf.apply()之前,x就又被求值了,完全搞不懂这是怎么回事。
我怀疑是编译器优化搞的鬼,于是改成不硬编码数字3来测试:
Scanner scanner = new Scanner(System.in); Function<Integer, Integer> before = x -> x + 1; Function<Integer, Integer> after = x -> x * 2; Function<Integer, Integer> combinedf = after.compose(before); System.out.println(combinedf.apply(scanner.nextInt()));
结果还是一样。
后来我采纳了@wuhoyt的建议,把断点设置为“全部”,同时拆分了代码,现在调试结果终于符合预期了,但我搞不懂为什么必须把断点设为“全部”才行。
Scanner scanner = new Scanner(System.in); Function<Integer, Integer> before = x -> x + 1; Function<Integer, Integer> after = x -> x * 2; Function<Integer, Integer> combinedf = after.compose(before); Integer input = scanner.nextInt(); Integer result = combinedf.apply(input); System.out.println(result);
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

