使用lambda表达式从对象列表中选择Object

时间:2014-07-17 09:25:15

标签: java eclipse lambda java-8

大家好我有一个List<User>我希望添加一个返回使用Id找到的特定用户的方法。我想使用lambda表达式,所以我尝试了这个,但它不起作用。

...
List<User> user = users.stream().filter(x -> x.id == id).collect(Collectors.toList());
return user[0];

这段代码编译并给我这些错误:

The method stream() is undefined for the type List<User>
Lambda expressions are allowed only at source level 1.8 or above *
Collectors cannot be resolved
  • 我正在使用eclipse 4.4.3 Kepler,我在机器中安装了java 8,在eclipse中使用了java8的插件

3 个答案:

答案 0 :(得分:21)

建议:如果你只想要第一个元素匹配条件,不要收集要列出的所有元素(它有点矫枉过正),请改用findFirst()方法:

return users.stream().filter(x -> x.id == id).findFirst().get();

请注意,findFirst()将返回Optional个对象,如果没有此类元素,get()将抛出异常。

答案 1 :(得分:4)

你有两个问题。

  • 您必须启用Java 1.8。 Eclipse中的合规性级别,并成功导入Java8特定的类/接口。你要做的是以下几点:

    1. 右键单击该项目,然后选择Properties
    2. 在已打开的窗口中选择Java Compiler
    3. JDK Compliance下,取消选中Use compliance level from execution environment....复选框,然后从1.8下拉列表中选择Compliance level
    4. 点击OK和您的完成。

执行此操作后,您会注意到return语句未编译。这是因为Java中的List对象不是数组,因此user[0]之类的语句对列表无效。你要做的是:

return user.get(0);

答案 2 :(得分:0)

您可以使用 Java 8 Stream API 返回列表中通过 Id 找到的特定用户。看看这个link

User user = users.stream()
  .filter(x -> x.id == id)
  .findAny()
  .orElse(null);
  • 在列表中调用stream()
  • 使用适当的谓词调用 filter() 方法
  • 调用 findAny() 构造,该构造返回与包装在可选中的过滤谓词匹配的第一个元素(如果存在此类元素)

为方便起见,如果 Optional 为空,我们默认为 null,但这可能并不总是适用于每种情况的最佳选择。