Приведен список объектов, которые необходимо отсортировать и сгруппировать:
static class Widget {
// ...
public String getCode() { return widgetCode; }
public String getName() { return widgetName; }
}
List<Widget> widgetList = Arrays.asList(
// several widgets with codes and names
);
Я хочу сгруппировать список в список списков, сгруппированный по widgetCode , с элементами каждого подсписка в порядке, в котором они встречались в исходном списке. Я знаю, что могу сгруппировать их в Карту списков, используя groupingBy
Collector:
Map<String,List<Widget>> widgetMap = widgetList.stream()
.collect(groupingBy(Widget::getCode));
Я не считаю само собой разумеющимся, что ключи отсортированы, поэтому я предпринял дополнительный шаг загрузки всего объекта в тип SortedMap:
SortedMap<String,List<Widget>> sortedWidgetMap = new TreeMap<String,List<Widget>>(
widgetList.stream()
.collect(groupingBy(Widget::getCode))
);
Я знаю, что могу получить коллекцию из sortedWidgetMap с помощью .values (), и я предполагаю, что это упорядоченная коллекция, поскольку она исходит из упорядоченного типа карты, так что мое текущее решение:
Collection<List<Widget>> widgetListList = new TreeMap<String,List<Widget>>(
widgetList.stream()
.collect(groupingBy(Widget::getCode))
).values();
widgetListList.forEach(System.out::println); // do something with the data
Пока это работает, но я не уверен, что результирующий widgetListList на самом деле гарантированно будет в правильном порядке (т.е. widgetCode ) или что подсписки будут построены в порядке они были найдены в первоначальном списке. Кроме того, я думаю, что для достижения желаемого результата должна быть возможность использовать только API-интерфейс Stream. Итак, как я могу сделать это лучше?