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

10-09 00:40
查看更多