【问题标题】:Stream collect method流收集方法
【发布时间】:2020-08-10 01:59:21
【问题描述】:

我不想第二次从 Stream.collect 方法创建新列表。它应该只添加到以前的列表中。我正在尝试像下面那样做,但它不起作用。 根据文档, Collectors.toList() 始终创建新列表,而 collect() 方法不允许旧列表。有什么办法可以让我第二次重用我以前的列表(listA)。

List<A> listA = xList.stream().map().collect(Collectors.toList());
                 yList.stream().map().collect(**listA**);

【问题讨论】:

    标签: java


    【解决方案1】:

    不要使用.collect,而是写.forEach(listA::add)

    (从技术上讲,您还应该将第一个示例中的Collectors.toList() 替换为Collectors.toCollection(ArrayList::new),因为toList() 不保证它返回一个可变列表。)

    【讨论】:

      【解决方案2】:

      有几种方法可以实现它。这里有两个。它们非常相似。

      • 第一个简单地展平直接提供的两个列表。
      • 第二个将两个流连接在一起。
      List<A> list = Stream.of(xList, yList).flatMap(List::stream)
           .map(<someFnc>)
           .collect(Collectors.toList());
      
      List<A> list2 = Stream.concat(xList.stream().map(<someFnc>), 
            yList.stream().map(<someFnc>)
              .collect(Collectors.toList());
      

      【讨论】:

        【解决方案3】:

        您可以使用Stream.concat

        List<A> listA = Stream.concat(xList.stream().map(), yList.stream().map())
            .collect(Collectors.toList());
        

        【讨论】:

          【解决方案4】:

          你可以这样做 -

          List<A> listA = xList.stream().map().collect(Collectors.toList());    
          yList.stream().map().collect(Collectors.toCollection(() -> listA));
          

          编辑: collect 方法采用 Collector 并在内部 Collectors.toCollection 将 yList 元素添加到原始列表中 -

          Collector<T, ?, C> toCollection(Supplier<C> collectionFactory) {
              return new CollectorImpl<>(collectionFactory, Collection<T>::add,
                                         (r1, r2) -> { r1.addAll(r2); return r1; },
                                         CH_ID);
          }
          

          【讨论】:

          • 投反对票的人能解释一下这有什么问题吗?
          • 我不想第二次从 Stream.collect 方法创建新列表如果我不得不猜测我会说这是因为它没有将列表合并为一个不使用问题中要求的第二个流语句和集合。
          • 我不想第二次从 Stream.collect 方法创建新列表yList.stream().map().collect(**listA**) - 意味着yList需要附加到listA
          • @Pankaj 你可能是对的,我真的不知道。我同意这个问题有点模棱两可,因此可以有不同的解释。
          • 阅读 newCollection 的 Javadoc:collectionFactory - 一个 Supplier,它返回一个新的 empty Collection类型。
          猜你喜欢
          • 2021-09-15
          • 1970-01-01
          • 2019-06-05
          • 2017-07-23
          • 2015-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多