java - 为什么 lambda 强制我使用单个元素数组而不是最终对象?

标签 java lambda java-8

我有以下类(class):

public class Item{
   private String name;
   //setter getter
}

和项目集合。我想获取集合中最后一项的名称。为此,我只需遍历所有集合并最后使用。问题是我不知道为什么它会强制我使用一个元素字符串数组。

为什么我必须使用:

String[] lastName = {""};
items.forEach(item -> lastName[0] = item.getName());
System.out.println(lastname[0]);

代替:

final String lastName;
items.forEach(item -> lastName = item.getName());
System.out.println(lastname);

最佳答案

您不能将 lastName 设为 String,因为在 lambda(或匿名内部类)中使用的局部变量必须(有效)final ( see here ),即您不能在 .forEach 循环中每次执行 lambda 时覆盖它。当使用数组(或其他一些包装器对象)时,您不会为该变量分配新值,而只会更改它的某些方面,因此它可以是最终的。

或者,您可以使用 reduce 跳到最后一项:

String lastName = items.stream().reduce((a, b) -> b).get().getName();

或者,如注释中所述,跳过n-1 个元素并取其后的第一个元素:

String last = items.stream().skip(items.size() - 1).findFirst().get().getName();

关于java - 为什么 lambda 强制我使用单个元素数组而不是最终对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933530/

相关文章:

java - Vavr `Try.of` 与 `Try.run` 有什么区别

java - 如果列表为 null 使用 lombok getter 初始化列表?

java - 将复选框添加到 jTable 中?

java - 枚举单例,由接口(interface)引用,由字符串名称引用实例

python - Python 3 中函数和 lambda 之间的差异以及何时使用which

c++ - AOT编译语言是如何实现匿名函数的?

c# - 嵌套 Lambda 表达式

java - 方法调用后原始局部变量会发生什么?

java - While 循环绘制钻石

java - 在接口(interface)默认方法中使用 spring 托管 beans?