Java 8 流:myList.stream().map(Foo::bar).collect(Collectors.toList()) 的简写

标签 java generics java-8 java-stream collectors

以下是否有通用的简写?欢迎像 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来自 CollectionIterable使用相同的方式。随意传递您的自定义 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() .

    关于Java 8 流:myList.stream().map(Foo::bar).collect(Collectors.toList()) 的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63600503/

    相关文章:

    Java 线程 hibernate

    java - 将继承的变量强制转换为子类

    haskell - 为什么通用函数以特殊的方式处理列表头?

    c# - 在同一方法签名中的函数的 TIn 的扩展方法中使用此类型参数的类型

    Java 8 流分组。如果只有一个分组值对象,如何设置字段?

    java - "Restful"Java WEB MVC 框架

    java - 在 jpql select 中指定列会导致转换错误

    java - 从 IntStream 对象中的 mapToObj 函数返回 Callable<Double> 列表

    java - 如何重构执行类似操作的 if-else 主体?

    Java - Java8 中的 JVM 垃圾收集器