可以使用java 8 lambda在单行中减少以下代码



数据库获取记录,我可以减少以下行吗?

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));

最新更新