为什么我的Java功能接口不能修改其Integer输入?

时间:2019-03-21 18:25:57

标签: java immutability autoboxing

编辑1:我知道此问题已被标记为重复,因此我最初将其删除。但是,在阅读in this Meta Post后,删除是不好的,我应该编辑我的问题而不是删除它,我未删除并试图为可能遇到与我相同的问题的其他人改善该问题。

标记为“已回答”的帖子与我已经知道的内容(以及我经常阅读的帖子)相关联,但不代表我的问题/困惑时,我尝试扩展测试案例并意识到我的问题是不是了解参考,而是误解了自动装箱的工作方式以及elif shifter + shift1 > 90: 参考与其(不变)值之间的关系。请参阅原始问题下方的编辑,它说明了我的困惑。

原始问题:

我仍在尝试学习如何利用Java 8+ lambda功能接口。虽然我知道修改传递给方法的参数并不一定是最佳实践,但我不确定为什么在表达式内修改的lambda表达式的输入值不会被修改。

这是一个示例程序,我希望将其输入(Integer)的值修改为值t

42

输出:

  

为什么0不等于42?

编辑2:

正如第一个评论者所指出的那样,问题在于试图重新分配参数(一个不变的import java.util.function.Consumer; public class Main { static Consumer<Integer> foo = n -> { n = 42; }; public static void main(String... args) { Integer t = 0; foo.accept(t); System.out.println("Why is " + t + " not equal to 42?"); } } 容器)。我并没有真正尝试更改Integer reference ,而是试图更改盒装值,并假定Java会自动为我做到这一点。我错了。

下面,我已经修改了较早的代码,以演示我将要发生的事情和期望的事情。尽管有关“按价值传递”的标记重复是相关的,并且是几个相关的问题之一,但这并不是我困惑的根源。最终,这是我对自动装箱的工作方式(创建新对象,而不是修改现有对象的装箱值)的误解。

Integer

结果:

  

看看42等于42。

0 个答案:

没有答案