да
пошел раскурю, спасибо за наводку
Возвращаясь к баранам, чот я подзастрял и снова вынужден попросить помощи. Я немного некорректно поставил изначальные условия, поэтому приложу example с кодом, который получаю на входе: https://pastebin.com/zy2kdDt4 Мне нужно на выходе получить не Map<String, Set<String>>, а Map<String, String> при этом из set нужно кастомно выбрать значение по определенному алгоритму (по сути предикат). Если я делаю Collectors.filtering то я получаю каждое значение map (т. е. в Predicate у меня entrySet с одним значением, а мне нужно, чтобы там был весь массив вариантов, чтобы из него выбрать один). Если смотреть на пример выше по ссылке, я хочу получить в конечном итоге мапу вида: key1 => one, key2 => two key3 => three Значением в мапе должно определяться по кастомному алгоритму и оно обязательно должно анализировать все элементы по этомуц ключу (т. е. там проверка на вхождение) Скорее всего решение простое, просто я не догоняю как правильно использовать коллектор нужный. Буду благодарен за помощь.
Пока придумал вот так: Map<String, Set<String>> collect = maps.stream().flatMap(map -> map.entrySet().stream()) .collect(Collectors.groupingBy(es -> es.getKey(), Collectors.mapping(es -> es.getValue(), Collectors.toSet()))).entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, es -> getOne(es.getValue()))); Но мне не неравится двойное преобразование в поток и хочется сделать сразу получить нужный результат
public static main { Map<String, Set<String>> original = new HashMap<>(); Map<String, String> result = new HashMap<>(); original.entrySet().stream() .map(mapper()) .forEach(entry -> result.put(entry.getKey(), entry.getValue())); } public static Function<Map.Entry<String, Set<String>>, Map.Entry<String, String>> mapper() { return stringSetEntry -> { String myUniqueValue = filterUniqueValueFromSet(stringSetEntry.getValue()); return Map.entry(stringSetEntry.getKey(), myUniqueValue); }; }
Обсуждают сегодня