Часто возникает необходимость преобразовать результаты поиска по запросу:Список <Object[]> к карте <K, V> в Java 8
select category, count(*)
from table
group by category
на карте, в которой ключи являются категории и значения количества записей, принадлежащих к одной и той же категории ,
Многие основы сохранения возвращают результаты такого запроса, как List<Object[]>
, где массивы объектов содержат два элемента (категория и счетчик для каждой строки возвращаемого набора результатов).
Я пытаюсь найти наиболее читаемый способ преобразования этого списка в соответствующую карту.
Конечно, традиционный подход предполагает создание карты и ввода записей вручную:
Map<String, Integer> map = new HashMap<>();
list.stream().forEach(e -> map.put((String) e[0], (Integer) e[1]));
Первый лайнер, который пришел мне на ум, чтобы использовать из коробки доступного Collectors.toMap
коллектора:
Map<String, Integer> map = list.stream().collect(toMap(e -> (String) e[0], e -> (Integer) e[1]));
Однако, я нахожу это e -> (T) e[i]
синтаксисом, менее читаемым, чем традиционный подход. Чтобы преодолеть это, я мог бы создать метод Util, который я могу повторно использовать во всех таких ситуациях:
public static <K, V> Collector<Object[], ?, Map<K, V>> toMap() {
return Collectors.toMap(e -> (K) e[0], e -> (V) e[1]);
}
Тогда у меня есть идеальный Однострочник:
Map<String, Integer> map = list.stream().collect(Utils.toMap());
Там даже нет необходимости cast key и value из-за вывода типа. Однако это немного сложнее понять для других читателей кода (Collector<Object[], ?, Map<K, V>>
в сигнатуре метода утилиты и т. Д.).
Мне интересно, есть ли что-нибудь еще в панели инструментов java 8, которая могла бы помочь этому достичь в более читаемом/элегантном стиле?
У вас уже есть рабочий код, который представляет собой одну строку. Я не уверен, какие еще «инструменты» вам нужны. Какие ответы вас интересуют? – Tunaki
То, что вы делаете, кажется прекрасным, за исключением того, что я передавал бы «Class» и «Class » на 'toMap', чтобы проверки могли быть проверены. –
Radiodef
@ Tunaki True. Но я думаю, что для меня и для других было бы полезно увидеть примеры того, как это можно улучшить, чтобы оно могло применяться в этом и подобных случаях использования. –