【问题标题】:Getting object from stream JAVA从流JAVA中获取对象
【发布时间】:2018-05-04 07:39:15
【问题描述】:

我正在尝试使用流按名字和姓氏查找朋友。是否可以从此流中返回对象?喜欢这个名字和姓氏的朋友吗?因为现在返回不匹配。

@Override
public Friend findFriend(String firstName, String lastName) throws FriendNotFoundException { 
    if (firstName == null || lastName ==null) {
         throw new IllegalArgumentException("There is no parameters");
    }

           List<Friend> result = friends.stream()
            .filter(x -> (firstName.equals(x.getFirstName())) && 
            (lastName.equals(x.getLastName()))))
            .collect(Collectors.toList());

            return result;

【问题讨论】:

  • 致电findAny()findFirst() 而不是collect()

标签: java object methods return java-stream


【解决方案1】:

像这样使用findFirst

return friends.stream()
              .filter(x -> firstName.equals(x.getFirstName()) && 
                            lastName.equals(x.getLastName())
                     )
              .findFirst().orElse(null);

或返回Optional&lt;Friend&gt;,即:

@Override
public Optional<Friend> findFriend(String firstName, String lastName) throws FriendNotFoundException { 
       if (firstName == null || lastName == null) {
          throw new IllegalArgumentException("There is no parameters");
       }

       return friends.stream()
              .filter(x -> firstName.equals(x.getFirstName()) && 
                            lastName.equals(x.getLastName())
                     )
              .findFirst();
}

这意味着您要覆盖的方法也必须声明为返回Optional&lt;Friend&gt;,如果需要,在继承层次结构中以此类推。

【讨论】:

  • 使用 Optional 的好提示。不过,您可能想使用findAny()。对于大型流,它可能更有效。
  • @MalteHartwig 是的,我会推荐findAny 在使用parallelStream 执行批量操作时,因为在这种情况下使用findAny 而不是使用findFirst 的限制较小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多