我有以下类(class):
public class Item{
private String name;
//setter getter
}
以及 Collection 品。我想获取集合中最后一个项目的名称。为此,我只需遍历所有集合并最后使用。问题是我不知道为什么它迫使我使用一个元素String数组。
为什么我必须使用:
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();
或者,如注释中所述,
skip
编码前n-1个元素,然后取第一个元素:String last = items.stream().skip(items.size() - 1).findFirst().get().getName();
关于java - 为什么lambda强制我使用单元素数组而不是最终对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28961578/