以下是否有通用的简写?欢迎像 Guava 这样的外部依赖项。
myList.stream().map(Foo::bar).collect(Collectors.toList());
如果我必须实现它,它会是这样的:static <T, U> List<U> mapApply(List<T> list, Function<T, U> function) {
return list.stream().map(function).collect(Collectors.toList());
}
有没有适用于任何 Iterable 的?如果没有,我该怎么写?我开始这样思考:static <T, U, V extends Iterable> V<U> mapApply(V<T> iterable, Function<T, U> function) {
return iterable.stream().map(function).collect(???);
}
最佳答案
在这种情况下 Foo::bar
返回 Foo
的实例再次,即。你需要改造T
进入 T
再次,然后您可以使用 List::replaceAll
使用 UnaryOperator<T>
,因此每个项目都被相同类型的一个替换。此解决方案改变了原始列表。
List<String> list = Arrays.asList("John", "Mark", "Pepe");
list.replaceAll(s -> "hello " + s);
如果你想转型T
进入 R
,您所能做的就是将当前的解决方案与 stream()
序列一起使用。 -> map()
-> collect()
方法调用或简单的迭代。包装 this 的静态方法也可以这样做。请注意,您不能创建
Stream
来自 Collection
和 Iterable
使用相同的方式。随意传递您的自定义 Collector
.T
是输入的泛型类型 Collection
或 Iterable
. R
是映射函数结果的泛型类型(从 T
映射到 R
)来自
Collection<T>
List<Bar> listBarFromCollection = mapApply(collectionFoo, Foo::bar, Collectors.toList());
static <T, R> List<R> mapApply(Collection<T> collection, Function<T, R> function) {
return collection.stream()
.map(function)
.collect(Collectors.toList());
}
来自 Iterable<T>
List<Bar> listBarFromIterable = mapApply(iterableFoo, Foo::bar, Collectors.toList());
static <T, R> List<R> mapApply(Iterable<T> iterable, Function<T, R> function) {
return StreamSupport.stream(iterable.spliterator(), false)
.map(function)
.collect(Collectors.toList());
}
... 带有
Collector
:如果你想通过自定义
Collector
,应该是 Collector<R, ?, U> collector
和方法的返回类型 U
而不是 List<R>
.正如@Holger 指出的,传递 Collector
到方法与调用实际 stream()
没有太大区别-> map()
-> collect()
.
关于Java 8 流:myList.stream().map(Foo::bar).collect(Collectors.toList()) 的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63600503/