有以下通用的缩写吗?欢迎使用像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()
方法调用结合使用,或者进行简单的迭代。封装此方法的静态方法也将执行相同的操作。请注意,您无法使用相同的方式同时从
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()
并没有太大区别。