当前位置: 首页 > 知识库问答 >
问题:

将两个基元类型流转换为一个对流[duplicate]

太叔豪
2023-03-14

我有两个收藏:

List<String> names = ...
List<Long> counts = ...
List<Foo> foos = ... 
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对象?

共有1个答案

吉岳
2023-03-14

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

您需要确保在调用List::Get时不抛出IndexOutOfBoundsException。我更喜欢两种方式:

>

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

    List<Foo> fooList = new ArrayList<>();
    while (namesIterator.hasNext() && countsIterator.hasNext()) {
        Foo foo = new Foo(namesIterator.next(), countsIterator.next());
        fooList.add(foo);
    }
    
    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);
    }
    
    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。zipping机制在各个库中几乎是相同的。

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

  •  类似资料:
    • 我正在编写一个返回json的web服务api框架。我使用Jackson库反序列化json字符串。api返回一个属性来继续获取请求的结果。这样的回应: 所有的回答都有这样的结构。唯一的问题是continue属性的名称因请求而异。名字是这样的 我想只创建一个类,并且能够将json映射到这个类。我怎么能那样做?这是我想要的:

    • 我有两个枚举,它们实现了如下相同的接口:- 名为SystemA和SystemB的两个枚举正在实现此接口。 我想要像这样应用getConfigFunction:- 但它会抛出编译时错误,因为形成的流的类型为:Config[]。所以我尝试了以下修改:- 但这也失败了,因为我还需要修改forEach部分。有人能帮忙吗?我该如何修改forEach部分,或者我该如何使用map()/flatmap()函数,这

    • 我有以下代码来返回对象数组,对象数组中填充了基元类型的结构元素,我不知道如何将基元类型转换为jobject,然后使用SetObjectArrayElement方法设置为ObjectArray, 下面是我的C结构信息 我的JNI代码 写入核心转储失败。核心转储已被禁用。要启用核心转储,请在再次启动Java之前尝试“ulimit-c unlimited” 包含更多信息的错误报告文件保存为:/data1

    • 问题内容: 我有一个由Java 8流表示的数据集: 我可以看到如何对其进行过滤以获取随机子集-例如 我还可以看到如何减少该流,例如得到两个表示数据集的两个随机一半的列表,然后将它们转换回流。但是,是否有直接方法可以从最初的一个生成两个流?就像是 感谢您的任何见解。 问题答案: 不完全是。您不可能一分之二。这没有道理-您将如何遍历一个而不需要同时生成另一个?流只能操作一次。 但是,如果要将它们转储到

    • 我在处理流时遇到了一些麻烦。本质上,我有一个

    • 我有以下型号 我试图通过名称和组名称获得一个实例。 我可以用下面的代码来做 但是我想把它变成一个查询。对如何实现这一点有什么想法吗?