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

时间:2014-12-19 03:15:50

标签: java java-8 java-stream

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

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

5 个答案:

答案 0 :(得分:8)

在一个步骤中组合filtermap在Java类型系统中没有用。例如。没有这样的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());

答案 1 :(得分:0)

当我在某处读到时,我正试图提供你问题的答案 -

<R,A> R collect(Collector<? super T,A,R> collector)

R - 结果的类型 A - 收集器的中间累积类型 收集器 - 描述减少的收集器 返回 - 减少的结果

使用收集器对此流的元素执行可变减少操作。收集器封装用作收集参数的函数(Supplier,BiConsumer,BiConsumer),允许重用收集策略和收集操作的组合,例如多级分组或分区。 如果流是并行的,并且收集器是并发的,并且流是无序的或收集器是无序的,那么将执行并发减少(有关并发减少的详细信息,请参阅收集器。)

这是终端操作。

当并行执行时,可以实例化,填充和合并多个中间结果,以便保持可变数据结构的隔离。因此,即使与非线程安全的数据结构(例如ArrayList)并行执行,并行还原也不需要额外的同步。

以下内容将字符串累积到ArrayList中:

List<String> asList = stringStream.collect(Collectors.toList());

以下将按州和城市对Person对象进行分类,将两个收集器级联在一起:

 Map<String, Map<String, List<Person>>> peopleByStateAndCity
     = personStream.collect(Collectors.groupingBy(Person::getState,
                                                  Collectors.groupingBy(Person::getCity)));

答案 2 :(得分:0)

据我所知,Stream界面和一些支持库,没有“强<单> 操作可以同时执行这两个操作并生成输出{{ 1}}(基于我对Scala Stream方法的简短阅读)。

您需要将这两个函数应用于collect以获取所需的输出Stream,然后可以将其收集或者要应用于其中的任何其他函数。

Stream

答案 3 :(得分:0)

据我了解Scala文档,collect根据函数是否存在进行过滤,并将函数应用于每个限定对象。 Java类具有固定的定义,因此这样的测试没有多大意义。最接近的模拟是测试接口并在多个步骤中调用其方法(函数):

stream.filter(e -> e instanceof SomeInterface).map(SomeInterface.class::cast).map(AnotherClass::convertSomeInterfaceToSomethingElse)

答案 4 :(得分:0)

试试这个

tList.stream().map[E](func).collect(Collectors.toList[E])

tList是你的源列表类型,E是你想要返回的类型。如果源类型与返回类型相同,则mapE中不需要[E],似乎scala中的map func返回type是object。