如何在地图

时间:2018-05-02 07:33:08

标签: java

我有一个场景,我需要读取一个JSON文件并检查一个键(MEMBER_ID)的重复条目,如果存在重复,那么我需要获取最后一个条目(成员的最新更新详细信息)并添加到最终名单。例如,在json下面,对于MEMBER_ID=123,有2个条目,其中一个LASTNAMEVSDWRVFFZA应添加到最终列表中。我尝试了几种方法来进行过滤,但无法提出最终解决方案。有人可以建议我如何处理这个问题?

我写的逻辑是:

List<Map<String, Object>> finalList = new ArrayList<>();
...
...

`if (file.exists() && file.length() != 0) {
            jsonValue = objectMapper.readValue(file, List.class);
            jsonValue.forEach(value -> {
                try {
                    populateAndMapJSON(value);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });`...
...


        private void populateAndMapJSON(Map<String, Object> value) throws IOException {

        if ((value.containsKey(FIRST_NAME) || value.containsKey(LAST_NAME)) {

// NOT SURE HOW TO PUT FILTER HERE FOR GIVEN SCENARIO

            finalList.add(value);
...
..

//我正在使用的JSON:

{
    "MEMBER_ID": "123",
    "LASTNAME": " fgjksnc",
    "BIRTH_DATE": "1905-12-29",
    "FIRSTNAME": "abcdf",
}, {
    "MEMBER_ID": "09876",
    "M": "abc",
    "N": "def"
}, {
    "MEMBER_ID": "123",
    "LASTNAME": "VSDWRVFFZA",
    "BIRTH_DATE": "1905-12-20",
    "FIRSTNAME": "UFZCY LGNF",
}

1 个答案:

答案 0 :(得分:0)

使用流API,您可以

  • 按MEMBER_ID分组(按ID显示匹配列表),然后
  • 使用最后一个匹配减少多个匹配

代码:

Set<Map<String, Object>> uniqueByLast = finalList.stream()
        .collect(Collectors.groupingBy(m -> m.get("MEMBER_ID"))) // group by id
        .entrySet().stream()
        .map(e -> e.getValue().stream()
                .reduce((first, second) -> second)) // find last, if multiple entries
        .map(Optional::get)
        .collect(Collectors.toSet());

因此,您将获得一组所有唯一对象图。