我可以按元素的类过滤Stream <t>并一步获取Stream <u>吗?

时间:2015-06-24 01:42:44

标签: java functional-programming java-8 java-stream

让我说我有

class Dog extends Animal {}
class Cat extends Animal {}

我有一份动物清单 使用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());

我无法制作过滤器和放大器。一步到位,对吧?

1 个答案:

答案 0 :(得分:3)

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