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

2022-08-31 16:41:06

Java 8流api是非常好的功能,我绝对喜欢它。让我紧张的一件事是,90%的时间我希望将输入作为集合,并将输出作为集合。结果是我必须一直调用和方法:stream()collect()

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

是否有任何java api可以让我跳过流并直接对集合进行操作(就像在c#中一样?linq

collection.filter(p->p.isCorrect)

答案 1

是的,使用 Collection#removeIf(谓词)

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

请注意,它将更改给定的集合,而不会返回新集合。但是,您可以创建集合的副本并进行修改。另请注意,谓词需要被否定才能充当过滤器:

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());
}

答案 2

您可能喜欢使用 StreamEx

StreamEx.of(collection).filter(PClass::isCorrect).toList();

这样做的优点是,在保持不可变性的同时,稍微简短一些。


推荐