让我说我有
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());
我无法制作过滤器和放大器。一步到位,对吧?
答案 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();