Я пытался сгруппировать значения, используя потоки и коллекторы.У меня есть список строк, которые я должен разделить.
Мои данные:
List<String> stringList = new ArrayList<>();
stringList.add("Key:1,2,3")
stringList.add("Key:5,6,7")
Ключ - это ключ на карте, а 1,2,3 - это значения на карте
Сначала я попытался использовать простой toMap
Map<String, List<Integer>> outputKeyMap = stringList.stream()
.collect(Collectors.toMap(id -> id.split(":")[0],
id-> Arrays.stream(id.split(":")[1].split(",")).collect(Collectors.toList());
, но он не работает, потому что он всегда создает один и тот же ключ.Поэтому мне нужно использовать функцию groupingBy
.
Map<String, List<Integer>> outputKeyMap = stringList.stream().collect(groupingBy(id -> id.toString().split(":")[0],
TreeMap::new,
Collectors.mapping(id-> Arrays.stream(id.toString().split(":")[1].split(","))
.map(Integer::valueOf)
.collect(Collectors.toSet()))));
Но в этом решении компилятор не видит значений, переданных в лямбда-функции, и я не понимаю, почему Function
является первым параметром, итакже в Collectors.mapping
.В этом решении поток не работает.
Collectors.groupingBy (Function<? super T, ? extends K> classifier,
Supplier<M> mapFactory,
Collector<? super T, A, D> downstream)
Редактировать: почему не работает функция groupingBy
Я забыл добавить Collectors.toSet () в Collectors.mapping в качестве второго параметра.Но затем я получаю Сет в Сете, так что это не то, что я ищу.Должно быть использовано flatMapping, но оно есть в Java9.
Map<String, Set<Set<String>>> collect = stringList.stream()
.collect(groupingBy(id -> id.split(":")[0],
TreeMap::new,
Collectors.mapping(id-> Arrays.stream(id.toString().split(":")[1].split(","),
Collectors.toSet())