首页 > 解决方案 > 组合两个 Java 列表中的值

问题描述

我从数据库中提取的列表:(list1)

[
  {
    "id": 123, 
    "code": null,
    "subCode": null,
    "email": "test@gmail.com"
  },
  {
    "id": 124, 
    "code": null,
    "subCode": null,
    "email": "test2@gmail.com"
  }
  ...
]

我从请求中得到的列表:(响应)

{
"code": "4d2042b5",
"result": [
  {
  "subCode": "d2042d2042",
  "email": "test@gmail.com"
  },
  {
  "subCode": "er3442rer",
  "email": "test2@gmail.com"
  }
 ...
]
}

(对不起我的英语)
我必须将第一个列表与第二个列表结合起来,编辑和更新数据库。

我想得到的清单:

[
  {
    "id": 123, 
    "code": "4d2042b5",
    "subCode": "d2042d2042",
    "email": "test@gmail.com"
  },
  {
    "id": 124, 
    "code": "4d2042b5",
    "subCode": "er3442rer",
    "email": "test2@gmail.com"
  }
  ...
]

我怎样才能创建这个列表?

我试过的方法:

 list1.stream().filter(one -> response.result.stream()
                                .anyMatch(two -> two.getEmail().equals(one.getEmail())))
                .findAny().ifPresent(x-> {
            x.setCode(response.getCode());
            x.setsubCode(two.getSubCode);

谢谢您的回答

标签: javalistfilterjava-stream

解决方案


首先,创建一个查找表(使用 a )以根据(key)Map查找(value):subCodeemail

Map<String, String> responseMap = response.getResult()
    .stream()
    .collect(Collectors.toMap(obj -> obj.getEmail(), obj -> obj.getSubCode()));

{test@gmail.com=d2042d2042, test2@gmail.com=er3442rer}

现在您已经完成了从数据库中完成对象的所有设置(我们称之为它MyObject)。只要使用了setter,这里就不需要使用

final String code = response.getCode();
list1.forEach(myObject -> {
    final String subCode = responseMap.get(myObject.getEmail());
    myObject.setCode(response.getCode());
    myObject.setSubCode(subCode);
});

请注意,此解决方案假定每封电子邮件MyObject都可以在响应中找到(obj从 中获取的“”集合response.getResult)。


推荐阅读