我有以下类(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/