Сложная потоковая логика LinkedList - PullRequest
0 голосов
/ 03 октября 2018

Я имею дело со сложной логикой, которую я не могу понять правильно.Я пытаюсь уменьшить список, содержащий список свойств, в один объединенный объект, удаляя дубликаты keys .

Скажем, у меня есть класс Config со следующими элементами:

private int index;
private String name;
private Map<String, String> properties;

Этот объект будет в связанном списке объектов, List<Config>.Если объект Config в индексе 5 имеет ключ / значение в properties для "version = 2", но объект Config в индексе 1 имеет properties, который содержит "version = 1", мне нужно свойствов индексе 5, чтобы выиграть.Итак, я хочу один последний Config (позже я буду беспокоиться об элементе name), который имеет объединенные свойства, которые отражают последние свойства в потоке.

Я требую слишком много в одной операции?До сих пор я придумал что-то подобное, но оно не компилируется:

configList.stream()
        .map(it -> it.getProperties())
        .collect(Collectors.toCollection(() -> 
            new TreeSet<>(Comparator.comparing(???))))

Любая помощь приветствуется!

1 Ответ

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

Если я правильно понял вопрос, вы хотите получить все свойства и объединить их в одну карту, а если есть дубликаты, вы хотите установить приоритет свойства карты с наибольшим значением индекса в конфигурации.

Это решение, которое я придумал.

Map<String, String> properties = configList.stream()
                .sorted(Comparator.comparingInt(Config::getIndex)) //Sort the configs in ascending order by indexes.
                .flatMap(config -> config.properties.entrySet().stream()) //flat map all the properties
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (left, right) -> right)); //collect to a map

Здесь Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (left, right) -> right) происходит магия.

Так как мы уже отсортировали конфигурации по индексу, у нас всегда будет значение с более высоким индексом конфигурации внизу, и все, что мы делаем, это перезаписываем существующий ключ при возникновении дублирующего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...