This question already has answers here:
Is there a Java Stream method equivalent to Scala's collections “collect”?

(5个答案)


5年前关闭。




可以说我有
class Dog extends Animal {}
class Cat extends Animal {}

我有动物 list
使用Guava FluentIterable,我可以一步一步进行过滤和转换
List<Cat> cats = FluentIterable.from(animals)
    .filter(Cat.class)
    .toList();

使用Java8我需要做
List<Cat> cats = animals.stream()
     .filter(c -> c instanceof Cat)
     .map(c -> (Cat) c)
     .collect(Collectors.toList());

我无法一步一步完成过滤器和 map ,对吗?

最佳答案

map步骤在运行时是不必要的(它根本不执行任何操作),您只需要在编译过程中绕过类型检查即可。或者,您可以使用肮脏的未经检查的类型转换:

List<Cat> cats = ((Stream<Cat>) (Stream<?>) animals.stream().filter(
        c -> c instanceof Cat)).collect(Collectors.toList());

不幸的是,没有标准的方法可以一步完成,但是您可以使用第三方库。例如,在我的 StreamEx 库中,有一个select方法solves this problem:
List<Cat> cats = StreamEx.of(animals).select(Cat.class).toList();

关于java - 我可以按元素的类过滤Stream <T>并一步获得Stream <U>吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31016222/

10-10 16:40