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

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

<分区>

假设我有

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/

相关文章:

javascript - 如何使用 Ramda remove 从对象数组中删除空对象?

java - 柯里化(Currying)一个现有的静态函数

Java 8 Stream map 调用字符串与组合成一个

C# https 请求总是隧道到服务器,但 Java 只有一次

java - JaNeLA 的 JNLP 错误

f# - FSharp 中的签名实现

java - 使用并行流返回最快的提供值

java - 从 Java 8 中的流中收集同步数组列表

java - 如何测试 Java 应用程序的输入和输出?

java - Android自定义图库禁用滚动