首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Java中迭代查询结果列表,并根据键值创建对象

在Java中迭代查询结果列表,并根据键值创建对象
EN

Stack Overflow用户
提问于 2021-12-01 23:07:39
回答 3查看 175关注 0票数 0

我执行了一个查询并获得了这个对象的结果列表:

代码语言:javascript
运行
复制
public MyObject {
      private String key;
      private String value1;
      private Integer value2;
}

结果如下:

关键技术指标- value1

1.商品-商品-商品

1.=‘1’>

2.商业、商业等行业

我想迭代这个列表,并创建这样的列表,按键对其进行分组。

代码语言:javascript
运行
复制
//first object of the list
public MyCreatedObject {
      private String key; //1
      private List<Value1> value1List; //WWW, WWW
      private List<Value2> value2List; //EEE, AAA
}

//second object of the list
public MyCreatedObject {
      private String key; //2
      private List<Value1> value1List; //WWW
      private List<Value2> value2List; //EEE
}

我已经尝试过使用流、迭代和一些东西,但是我真的在努力解决这个问题。

有人能帮我一下吗?

非常感谢各位

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-12-02 00:28:07

具有合并函数的Collectors.toMap可用于构建映射Map<String, MyCreatedObject>,然后将其值转换为列表,条件是提供了适当的MyCreatedObject的all-args构造函数:

代码语言:javascript
运行
复制
List<MyObject> input = ... ; // setup input data
List<MyCreatedObject> result = new ArrayList<>(input
    .stream()
    .collect(Collectors.toMap(
        MyObject::getKey, // 
        mo -> new MyCreatedObject(
            mo.getKey(), 
            new ArrayList<>(Arrays.asList(mo.getValue1())), 
            new ArrayList<>(Arrays.asList(mo.getValue2()))
        ),
        (co1, co2) -> { // merge inner lists in MyCreatedObject
            co1.getValue1List().addAll(co2.getValue1List());
            co1.getValue2List().addAll(co2.getValue2List());
            return co1;
        }
        //, LinkedHashMap::new // optional supplier to keep insertion order
    ))
    .values()
);
票数 0
EN

Stack Overflow用户

发布于 2021-12-01 23:58:06

您可以通过添加以下几个方法来使用MyCreatedObject作为收集器:

代码语言:javascript
运行
复制
static Collector<MyObject, ?, MyCreatedObject> collector() {
    return Collector.of(MyCreatedObject::new, MyCreatedObject::add, MyCreatedObject::merge);
}

void add(MyObject o) {
    key = o.key;
    value1List.add(o.value1);
    value2List.add(o.value2);
}

MyCreatedObject merge(MyCreatedObject other) {
    key = other.key;
    value1List.addAll(other.value1List);
    value2List.addAll(other.value2List);
    return this;
}

然后将其用作groupingBy()的下游收集器

代码语言:javascript
运行
复制
Map<String, MyCreatedObject> grouped = list.stream()
        .collect(Collectors.groupingBy(o -> o.key, MyCreatedObject.collector()));

或者,可以使用add()toMap()转换为构造函数和组。

代码语言:javascript
运行
复制
Map<String, MyCreatedObject> grouped = list.stream()
        .collect(Collectors.toMap(o -> o.key, MyCreatedObject::new, MyCreatedObject::merge));
票数 2
EN

Stack Overflow用户

发布于 2021-12-02 00:22:30

尝尝这个。

代码语言:javascript
运行
复制
record MyObject(String key, String value1, String value2) {}
record MyCreatedObject(String key, List<String> value1List, List<String> value2List) {}

public static void main(String[] args) {

    List<MyObject> list = List.of(
        new MyObject("1", "WWW", "EEE"),
        new MyObject("1", "WWW", "AAA"),
        new MyObject("2", "WWW", "EEE"));

    Map<String, MyCreatedObject> map = new LinkedHashMap<>();
    for (MyObject obj : list) {
        MyCreatedObject c = map.computeIfAbsent(obj.key(),
            k -> new MyCreatedObject(k, new ArrayList<>(), new ArrayList<>()));
        c.value1List().add(obj.value1());
        c.value2List().add(obj.value2());
    }
    List<MyCreatedObject> result = new ArrayList<>(map.values());

    for (MyCreatedObject obj : result)
        System.out.println(obj);
}

产出:

代码语言:javascript
运行
复制
MyCreatedObject[key=1, value1List=[WWW, WWW], value2List=[EEE, AAA]]
MyCreatedObject[key=2, value1List=[WWW], value2List=[EEE]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70192382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档