繁体   English   中英

如何理解这个 Java 8 Stream collect() 方法?

[英]How to understand this Java 8 Stream collect() method?

我试图将一个 int 数组转换为 List 并且我采用了使用 Java 8 Stream 的陌生路线并想出了这个

Arrays.stream(arr).boxed().collect(Collectors.toList());

我仍然很难完全理解这条线,主要是,

  1. 为什么在这种情况下Collectors.toList()返回一个ArrayList<Integer>实现List接口? 为什么不LinkedList<Integer>或任何其他符合List接口的通用 class ? 除了在 API 注释部分简要提及ArrayList之外,我找不到任何关于此的内容。

  2. 左边的面板是什么在此处输入图像描述 Stream.collect()是什么意思? 显然R是通用返回类型( ArrayList<Integer>在我的代码中)。 而且我认为<R, A>是该方法的泛型类型参数,但它们是如何指定的? 我查看了收集器界面文档,但无法吸收它。

  1. 这是一个默认实现。 使用ArrayList ,因为它在大多数用例中是最好的,但如果它不适合您,您可以随时定义自己的收集器并为您希望的Collection提供工厂:

     Arrays.stream(arr).boxed().collect(toCollection(LinkedList::new));
  2. 是的, AR是这个方法的泛型参数, R是返回类型, T是输入类型, A是中间类型,在整个收集元素的过程中都会出现(可能不可见,不关心这个函数) )。 Collector的 javadoc 的开头定义了这些类型(它们在整个 doc 中是一致的):

    T - 归约操作的输入元素类型
    A - 归约操作的可变累积类型(通常作为实现细节隐藏)
    R - 归约操作的结果类型

  1. 为什么在这种情况下 Collectors.toList() 返回一个 ArrayList 实现 List 接口?

正如方法定义所暗示的,它返回一个收集器实现,收集器供应商为ArrayList 因此,从下面的方法定义中非常清楚Collectors.toList总是返回 ArrayList 收集器( While it's arguable why toList not toArrayList word is used in method name )。

public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }
  1. <R, A> R collect(Collector<? super T, A, R> collector)左侧面板是什么意思

如果您参考文档注释,它会准确地提到这些泛型类型是什么:

/*
      @param <R> the type of the result
      @param <A> the intermediate accumulation type of the {@code Collector}
      @param collector the {@code Collector} describing the reduction
      @return the result of the reduction
*/
 <R, A> R collect(Collector<? super T, A, R> collector);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM