gpt4 book ai didi

java - 数组作为局部变量 - 不遵循 Lambda 中的明确赋值规则

转载 作者:行者123 更新时间:2023-12-01 19:42:54 25 4
gpt4 key购买 nike

看过以下主题:

Java8 Stream compiler message -- local variable must be final or effectively final

Variable assignment in lambda expression

根据JavaDoc

Any local variable, formal parameter, or exception parameter used but not declared in a lambda expression must either be declared final or be effectively final (§4.12.4), or a compile-time error occurs where the use is attempted.

Any local variable used but not declared in a lambda body must be definitely assigned (§16 (Definite Assignment)) before the lambda body, or a compile-time error occurs.

Similar rules on variable use apply in the body of an inner class (§8.1.3). The restriction to effectively final variables prohibits access to dynamically-changing local variables, whose capture would likely introduce concurrency problems. Compared to the final restriction, it reduces the clerical burden on programmers.

数组是否是规则的异常(exception) 1

验证 javadoc 的示例程序:

List<Integer> li = Arrays.asList(1,2,3,45,678); 
final int v = 2;
li.stream().filter(e-> e!=v).map(e->e).forEach(System.out::println);
v= 5;

compilation error at line v=5; , obviously

违反最终分配规则的示例代码段:

List<Integer> li = Arrays.asList(1,2,3,45,678); 
final int[] v = {2};
li.stream().filter(e-> e!=v[0]).map(e->e).forEach(System.out::println);
v[0]= 5;
<小时/>

输出:

3

45

678

上面的代码片段没有给出编译错误,我错过了什么吗?

最佳答案

第一种情况vint类型的变量,这里v的值为2,并且它是final变量。当您尝试分配 5 时,它会给出错误,因为您无法更改 final 变量值(按预期工作)。

来到第二种情况,v不是一个int类型的变量,它是一个数组。在Java中数组是对象,所以这里v是一个引用。通常,引用引用一个对象并包含该对象的地址。当您尝试在此处执行 v[0] = 5 时,您会更改对象内部的值,但不会更改引用的值。如果您尝试执行 v = new int[1]v={5} 那么您将收到编译错误

关于java - 数组作为局部变量 - 不遵循 Lambda 中的明确赋值规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54649135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com