Java 8 - 省去繁琐的收集方法

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

Java 8 stream API是非常好的功能,我绝对喜欢它。有一件事让我感到厌烦,那就是我有90%的时间想把收集和输出作为集合输入。结果是我必须始终打电话stream()collect()办法:

collection.stream().filter(p->p.isCorrect()).collect(Collectors.toList());

是否有任何Java API会让我跳过流并直接对集合进行操作(如linq在C#中):

collection.filter(p->p.isCorrect)
提问于
用户回答回答于

如果想对系列产品进行操作,Guava的FluentIterable是一种可行的方法!

示例(获得10个第一VIP客户的ID):

FluentIterable
       .from(customers)
       .filter(customer -> customer.isVIP())
       .transform(Client::getId)
       .limit(10);
用户回答回答于

是的,使用Collection#removeIf(Predicate)

删除此集合中满足给定谓词的所有元素。

请注意,它会改变给定的集合,而不是返回一个新集合。但是你可以创建一个集合的副本并对其进行修改。还要注意,谓词需要被否定为一个过滤器:

public static <E> Collection<E> getFilteredCollection(Collection<E> unfiltered,
                                                      Predicate<? super E> filter) {
    List<E> copyList = new ArrayList<>(unfiltered);

    // removeIf takes the negation of filter 
    copyList.removeIf(e -> { return !filter.test(e);});  

    return copyList;
}

但正如@Holger在评论中所建议的那样,如果您选择在您的代码中定义此实用程序方法并在任何地方使用它,则需要获取过滤的集合,然后将调用委托给collect该实用程序中的方法。您的调用者代码将更加简洁。

public static <E> Collection<E> getFilteredCollection(Collection<E> unfiltered,
                                                      Predicate<? super E> filter) {
   return unfiltered.stream()
                    .filter(filter)
                    .collect(Collectors.toList());
}

扫码关注云+社区