У меня есть класс Foo с некоторым полем, и я хочу сгруппировать их в Map<Object,List<Foo>>
по следующим полям:
class Foo {
private String cassette;
private List<String> organ; //not able to group on List<String>
private LocalDate date;
//getter setter toString
}
enum Group{
CASSETTE,
ORGAN,
DATE
}
У меня есть регистр переключения для группировки по java.util.function.Function
для Collectors.groupingBy()
следующим образом:
Function<Foo, Object> keyCriteria;
Group groupBy = Group.values()[1];//ordinal
switch (groupBy) {
case CASSETTE:
keyCriteria = p -> p.getCassette();
break;
case DATE:
keyCriteria = p -> p.getDate();
break;
case ORGAN:
keyCriteria = p -> p.getOrgan(); //facing problem while grouping with List<String>
break;
default:
keyCriteria = p -> p.getCassette();
}
Map<Object, List<Foo>> mapByCriteria = fooList.stream()
.collect(Collectors.groupingBy(keyCriteria));
System.out.println(mapByCriteria);
Все отлично работает, кроме case ORGAN:
Результат получен:
{[Lung, Liver] = [Foo [cassette = 1A , орган = [Легкие, Печень], дата = 2020-01-13]], [Печень] = [Foo [кассета = 2A, орган = [Печень], дата = 2020-01-15]]}
Ожидаемый результат:
{Печень = [Foo [кассета = 1A, орган = [Легкие, печень], дата = 2020-01-13], Foo [кассета = 2A, орган = [печень], дата = 2020-01-15]], легкое = [Foo [кассета = 1A, орган = [легкое, печень], дата = 2020-01-13]]}
Достигнут ожидаемый результат благодаря обходу следующего:
Map<Object, List<Foo>> collect = fooList.stream()
.flatMap(f -> f.getOrgan().stream().map(o -> new SimpleEntry<>(o, f))).collect(Collectors
.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
Я ищу switch
кейс и Generic
решение.