数据库获取记录,我可以减少以下行吗?
List<Object[]> rows = query.getResultList();
List<Map<Object, Object>> results= new ArrayList<Map<Object, Object>>();
for (Iterator<Object[]> iterator = rows.iterator(); iterator.hasNext()) {
Object[] objects = (Object[]) iterator.next();
HashMap d= new HashMap();
d.put("name", objects[0]);
d.put("id", objects[1]);
results.add(d);
}
这看起来像是新Java 9 API的完美用例:
List<Map<Object, Object>> results=rows.stream()
.map(objects -> Map.<Object,Object>of("name", objects[0], "id", objects[1]))
.collect(Collectors.toList());
或者,如果您不坚持要Object
映射键:
List<Map<String, Object>> results=rows.stream()
.map(objects -> Map.of("name", objects[0], "id", objects[1]))
.collect(Collectors.toList());
没有这个,就没有简洁的方法来创建这样的映射(这就是将新方法添加到 API 中的原因)。直接的方法是使用循环或自己创建地图工厂方法,如 fabian 的答案所示。
他的"我写过的最丑的单行本之一"确实不是很推荐,但是,可以简化:
List<Map<Object, Object>> results = rows.stream()
.map(x->Stream.of(0,1).collect(Collectors.toMap(i->i==0?(Object)"name":"id",i->x[i])))
.collect(Collectors.toList());
它是一个单一的语句,或者一个具有适当格式的"单行",但由于您可以将几乎所有内容都放在一行中,因此术语"单行"无论如何都没有什么意义。
尽管是单个语句,但与每个循环的直接循环相比,它的代码并不多......
减少到一行?不推荐它。但是,您可以使用帮助程序方法重写它,您可以使用该方法将其设置为单行:
public static Map<Object, Object> arrayToMap(Object[] objects) {
HashMap<Object, Object> d = new HashMap<>();
d.put("name", objects[0]);
d.put("id", objects[1]);
return d;
}
List<Map<Object, Object>> results
= rows.stream().map(ClassName::arrayToMap).collect(Collectors.toCollection(ArrayList<Map<Object, Object>>::new));
不使用 lambda 来简化代码(但肯定不止一行)的另一种方法是使用增强的 for 循环:
for (Object[] objects : rows) {
HashMap<Object, Object> d= new HashMap<>();
d.put("name", objects[0]);
d.put("id", objects[1]);
results.add(d);
}
PS:发布这段代码真的很伤我的感情,但这是我写过的最丑陋的单行代码之一(它也有次优的性能):
List<Map<Object, Object>> results
= rows.stream().map(x -> Arrays.stream(new Integer[] {0, 1}).collect(Collectors.<Integer, Object, Object>toMap(i -> new String[]{"name", "id"}[i], i -> x[i]))).collect(Collectors.toCollection(ArrayList<Map<Object, Object>>::new));