【问题标题】:Two primitive type streams to one stream of pairs [duplicate]两个原始类型流到一个对流[重复]
【发布时间】:2020-08-27 23:00:53
【问题描述】:

我有两个收藏:

List<String> names = ...
List<Long> counts = ...

我知道这两个集合是相等的,并且一个列表中位置 n 处的每个值都与另一个列表匹配。

我想执行一个转换,作为我收到的输出:

List<Foo> foos = ... 

其中Foo 是定义为的记录:

record Foo(String name, long count)

现在这是我的解决方案:

List<Foo> foos = IntStream.range(0, names.size())
                          .mapToObj(i -> new Foo(names.get(i), counts.get(i)))
                          .collect(Collectors.toList());

我的问题:还有其他方法可以配对和收集 Foo 对象吗?

【问题讨论】:

  • 请在代码审查中发布您的问题。
  • @RavindraRanwala - 这真是个糟糕的建议。代码审查不是关于如何以不同方式做某事的问题。
  • 当然还有其他方式,例如你可以使用一个循环。关于 Stream API,这是最简单的解决方案。由于它有效,而且您没有任何实际问题,因此不必费心考虑替代方案。
  • 你走对了! ..您可以进一步使用所有喜欢您的代码的库。有用的链接baeldung.com/java-collections-zip

标签: java java-stream


【解决方案1】:

您的解决方案依赖于两个集合的相同大小,因此我们应该关注这一点。让我们暂时搁置 Java Stream API,因为除了使用带有索引的IntStream 范围之外,没有其他方法可以同时遍历两个集合。简而言之,Java Stream API 不适合这种用例。

您需要确保在调用List::get 时不会抛出IndexOutOfBoundsException。我比较喜欢两种方式:

  1. 两个具有共轭条件的迭代器:

    List<Foo> fooList = new ArrayList<>();
    while (namesIterator.hasNext() && countsIterator.hasNext()) {
        Foo foo = new Foo(namesIterator.next(), countsIterator.next());
        fooList.add(foo);
    }
    
  2. 使用 for-each 迭代,索引不超过两个列表大小的下限:

    int bound = Math.min(names.size(), counts.size());
    List<Foo> fooList = new ArrayList<>();
    for (int i=0; i<bound; i++) {
        Foo foo = new Foo(names.get(i), counts.get(i);
        fooList.add(foo);
    }
    

    ..类似于Java Stream API的方式:

    List<Foo> fooList = IntStream.rangeClosed(0, Math.min(names.size(), counts.size()))
                                 .mapToObj(i -> new Foo(names.get(i), counts.get(i)))
                                 .collect(Collectors.toList());
    

还有一些带有专用压缩方法的外部库,例如来自 Guava 的 Streams::zip 或来自 jOOλ 的 Seq::zip。跨库的压缩机制几乎相同。

Java Stream API 目前的设计不适合它。

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2020-03-25
    相关资源
    最近更新 更多