List<Object[]> 到 Java 8 中的 Map<K, V>
2022-09-04 02:46:38
通常需要转换查询的结果,例如:
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]));
但是,我发现这种语法的可读性比传统方法要差一些。为了克服这个问题,我可以创建一个util方法,我可以在所有此类情况下重用它:e -> (T) e[i]
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());
甚至不需要因为类型推断而强制转换键和值。但是,对于代码的其他读者来说,这有点难以掌握(在util方法签名等中)。Collector<Object[], ?, Map<K, V>>
我想知道,java 8工具箱中还有其他东西可以帮助以更易读/更优雅的方式实现这一目标吗?