Scala的集合提供了一个称为collect
的方法,它将filter
和map
合并到一个单独的方法中。在过滤Object
集合以产生只包含特定类型的该集合子集时,它尤其有用。
Java 8的Stream中是否有类似的功能呢?
Scala的集合提供了一个称为collect
的方法,它将filter
和map
合并到一个单独的方法中。在过滤Object
集合以产生只包含特定类型的该集合子集时,它尤其有用。
Java 8的Stream中是否有类似的功能呢?
在Java中,结合filter
和map
的操作并不是很实用,因为其类型系统的限制。例如,没有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());
试试这样
tList.stream().map[E](func).collect(Collectors.toList[E])
tList是您的源列表类型,E是您想要返回的类型。如果源类型与返回类型相同,则在mapE中不需要[E],就像Scala中的map函数返回类型为对象一样。
我正在尝试回答你的问题,因为我在某个地方读到了这个答案 -
<R,A> R collect(Collector<? super T,A,R> collector)
R - 结果的类型 A - Collector 的中间累加器类型 collector - 描述 reduction 的 Collector 返回值 - reduction 的结果
使用 Collector 在此流的元素上执行可变 reduction 操作。Collector 封装了作为 collect(Supplier, BiConsumer, BiConsumer) 参数的函数,允许重用收集策略和组合 collect 操作,例如多级分组或分区。 如果流是并行的,并且 Collector 是并发的,并且流是无序的或 Collector 是无序的,则将执行并发 reduction(有关并发 reduction 的详细信息,请参见 Collector)。
这是一个终端操作。
在并行执行时,可能会实例化、填充和合并多个中间结果,以保持可变数据结构的隔离性。因此,即使与非线程安全的数据结构(如 ArrayList)并行执行,也不需要额外的同步来进行并行 reduction。
以下代码将字符串累加到 ArrayList 中:
List<String> asList = stringStream.collect(Collectors.toList());
Map<String, Map<String, List<Person>>> peopleByStateAndCity
= personStream.collect(Collectors.groupingBy(Person::getState,
Collectors.groupingBy(Person::getCity)));
Stream
的collect
方法。我在谈论Scala的collect
方法,并询问Java 8中是否有相应的方法。 - Daniel C. Sobralcollection.stream()
.filter(predicateFunction)
.map(mappingFunction)
.collect(Collectors.toList())
collect
是基于函数是否存在进行过滤,并将该函数应用于每个符合条件的对象。Java类具有固定的定义,因此这样的测试没有太多意义。最接近的类比是测试接口并在多个步骤中调用其方法(即函数):stream.filter(e -> e instanceof SomeInterface).map(SomeInterface.class::cast).map(AnotherClass::convertSomeInterfaceToSomethingElse)
map
、filter
和collect
调用来做正确的事情。那么你请求在一个方法调用中完成这个过程的目的是什么呢?因为这样做“感觉”更有效率吗? - HolgerStream
API,每个人都理解map(…).filter(…).collect(…)
和.filter(…).map(…).collect(…)
之间的区别。甚至可以推断出其他组合的含义,如map(…).filter(…).map(…).collect(…)
。 - Holgermap
和filter
;顺序可以从泛型类型签名中推断出来,但是不同之处在于对于方法链,即使不知道签名,你也可以直观地识别顺序。 - Holger