Scala的集合提供了一种名为collect
的方法,可将filter
和map
合并为一个方法。在过滤Object
集合以生成仅包含特定类型的集合的子集时,它特别有用。
Java 8的Stream有没有这样的东西?
答案 0 :(得分:8)
在一个步骤中组合filter
和map
在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。