我可以按元素类过滤Stream <T>并一步获取Stream <U>吗?

Pab*_*afi 6 java functional-programming java-8 java-stream

可以说我有

class Dog extends Animal {}
class Cat extends Animal {}
Run Code Online (Sandbox Code Playgroud)

我有一个动物列表使用Guava FluentIterable我可以一步过滤和转换

List<Cat> cats = FluentIterable.from(animals)
    .filter(Cat.class)
    .toList();
Run Code Online (Sandbox Code Playgroud)

使用Java8我需要做

List<Cat> cats = animals.stream()
     .filter(c -> c instanceof Cat)
     .map(c -> (Cat) c)
     .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

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

Tag*_*eev 3

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

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

不幸的是,没有标准方法可以一步完成此操作,但您可以使用第三方库。例如,在我的StreamEx库中有一个select方法可以解决这个问题

List<Cat> cats = StreamEx.of(animals).select(Cat.class).toList();
Run Code Online (Sandbox Code Playgroud)