Собрать поток EntrySet в LinkedHashMap - PullRequest
0 голосов
/ 24 октября 2018

Я хочу собрать поток в LinkedHashMap<String, Object>.

У меня есть ресурс JSON, который хранится в LinkedHashMap<String, Object> resources.Затем я отфильтрую JSON элементов, передав поток EntrySet этой карты.В настоящее время я собираю регулярные элементы потока HashMap.Но после этого я добавляю другие элементы на карту.Я хочу, чтобы эти элементы были в порядке вставки.

final List<String> keys = Arrays.asList("status", "createdDate");

Map<String, Object> result = resources.entrySet()
        .stream()
        .filter(e -> keys.contains(e.getKey()))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

result.put("date", "someDate");
return result;

Вот почему я хочу собрать поток в LinkedHashMap<String, Object>.Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Альтернативный способ сделать это с помощью Map.forEach:

Map<String, Object> result = new LinkedHashMap<>();
resources.forEach((key, value) -> {
    if (keys.contains(key)) {
        result.put(key, value);
    }
});
result.put("date", "someDate");

, и если вы могли бы рассмотреть итерацию keySet в качестве опции:

Map<String, Object> result = new LinkedHashMap<>();
resources.keySet().stream()
        .filter(keys::contains)
        .forEach(key -> result.put(key,resources.get(key)));
result.put("date", "someDate");
0 голосов
/ 24 октября 2018

Вы можете сделать это с помощью Stream:

Map<String, Object> result = resources.entrySet()
            .stream()
            .filter(e -> keys.contains(e.getKey()))
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (x, y) -> y, LinkedHashMap::new));

Часть (x, y) -> y из-за mergeFunction , когда находит повторяющиеся ключи, она возвращает значение второго найденного ключа.четвертая часть - mapFactory , которую поставщик предоставляет новую пустую карту, в которую будут вставлены результаты.

...