将值合并到两个Java列表中

时间:2020-07-20 15:08:51

标签: java list filter java-stream

我通过数据库提取的列表:(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);

谢谢您的回答

1 个答案:

答案 0 :(得分:0)

首先,创建一个查询表(使用Map),以根据subCode(键)查找email(值):

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)。只要使用了设置器,就不需要使用

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”集合)。