java - 是否有等同于 Scala 集合 "collect"的 Java Stream 方法?

标签 java java-8 java-stream

Scala 的集合提供了一个名为collect 的方法,它将filtermap 合并为一个方法。在过滤 Object 集合以生成仅包含特定类型的集合的子集时,它特别有用。

Java 8 的 Stream 有这样的东西吗?

最佳答案

考虑到 Java 的类型系统,在一个步骤中结合使用 filtermap 并不是很有用。例如。没有这样的 PartialFunction 类型。

最接近的是flatMap:

List<Object> list=Arrays.asList(0, "foo", 0L, 42.0, true, "false");
List<String> sList = list.stream()
  .flatMap(o-> o instanceof String? Stream.of((String)o): Stream.empty())
  .collect(Collectors.toList());
System.out.println(sList);

但是表现力

.flatMap(o-> o instanceof String? Stream.of((String)o): Stream.empty())

相比没有那么大
.filter(o -> o instanceof String).map(o -> (String)o)

当然,您可以创建一个辅助方法,将这些步骤封装在一个不可分解的操作中:

static <T> Stream<T> onlyType(Stream<?> s, Class<T> type) {
    return s.filter(type::isInstance).map(type::cast);
}

然后你就可以像这样使用了

List<String> sList=onlyType(list.stream(), String.class).collect(Collectors.toList());

关于java - 是否有等同于 Scala 集合 "collect"的 Java Stream 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27559231/

相关文章:

java - 使用固定字节数的java读取文件

java - Java 9 中的字符串连接是如何实现的?

Java 8 lambda null 检查用法

java - 如何使用 Java 8 流和自定义 List 和 Map 供应商将 List<V> 转换为 Map<K、List<V>>?

java - 为什么该值没有增加 int Firebase 数据库

java.util.zip.ZIPException : Not in GZIP format

java-8 - java 8 方法引用 : either `equals` or `equalsIgnoreCase`

java - Java 8 的 Maven 错误

java - 删除给定数组中出现次数超过 N 次的所有数字

java - Java 8 中的流 : simple solution to use parallelstream() on a cluster?