有以下通用的缩写吗?欢迎使用像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()方法调用结合使用,或者进行简单的迭代。
封装此方法的静态方法也将执行相同的操作。请注意,您无法使用相同的方式同时从StreamCollection创建Iterable。也可以随意传递您的自定义Collector
  • T是输入CollectionIterable的通用类型。
  • 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()并没有太大区别。

    10-08 09:00