У меня проблема с правильным объединением нескольких Collectors::groupingBy
функций и последующим применением их всех сразу к заданному входу.
Допустим, у меня есть некоторый класс, реализующий следующий интерфейс:
interface Something {
String get1();
String get2();
String get3();
String get4();
}
И теперь я могу иметь некоторый список комбинаций методов из этого интерфейса, то есть эти списки могут быть: [Something::get1, Something::get3]
, [Something::get2, Something::get1, Something::get3]
.
Теперь, имея такой список методов и имея списокчто-то, я хотел бы сгруппировать эти данные по получателям.
Я имею в виду, что, например, для списка [Something::get1, Something::get3]
и списка [Something1, Something2, ...]
Я хочу получить список чего-то, сгруппированных сначала по get1
, а затем get2
.
Этого можно достичь следующим образом:
var lst = List.of(smth1, smth2, smth3);
lst.stream()
.collect(Collectors.groupingBy(Something::get1, Collectors.groupingBy(Something::get3)))
Что если у меня есть произвольный список методов, которые я хотел бы применить к группировке?
Я думал о чем-то подобном (разумеется, это не работает, но вы поймете):
Предположим, что List<Function<Something, String>> groupingFunctions
- это наш список методов, которые мы хотим применить к группировке.
var collector = groupingFunctions.stream()
.reduce((f1, f2) -> Collectors.groupingBy(f1, Collectors.groupingBy(f2)))
, а затем
List.of(smth1, smth2, smth3).stream().collect(collector)
Но этот подход не работает.Как добиться результата, о котором я думаю?