java8lambda高效方法解决方案

byqmnocz  于 2021-06-27  发布在  Java
关注(0)|答案(4)|浏览(287)

我想使用Java8更有效、更清晰地改进代码。有人能告诉我,所以非常感谢你,我想从发电机的支票上得到空转名单和姓名。代码在下面。

LocalDateTime newStart = LocalDateTime.now();
List<Check> checks = generateCheck();
List<String> idListNew = new ArrayList<>();
List<String> nameListNew = new ArrayList<>();
checks.forEach(ck -> {
    idListNew.add(ck.getId());
    nameListNew.add(ck.getName());
});
htzpubme

htzpubme1#

如果您碰巧使用Java12或更高版本,那么您可以使用 teeing 收藏家:

Merger m = checks.stream()
    .collect(teeing(
        mapping(Check::getId, toList()),
        mapping(Check::getName, toList()),
        Merger::new));

System.out.println(m.ids());
System.out.println(m.names());
``` `mapping` ,  `teeing` 以及 `toList` 静态导入来自 `java.util.stream.Collectors` .
哪里 `Merger` 是以下形式的容器类:

private static record Merger(List ids, List names) { }

// Records are a language feature since Java 15. Otherwise, you could instead
// write this class yourself:
class Merger {
List ids;
List names;
// All-args constructor and getters
}

// Or you could just use an existing type like Map.Entry or Pair.

上述解决方案的优点是它只遍历一次列表,否则,如果列表非常大,就会造成性能损失。在这方面,您自己的解决方案具有相同的优势。
nzrxty8p

nzrxty8p2#

以上答案相同,但更有效的表现是:

LocalDateTime newStart = LocalDateTime.now();
List<Check> checks = generateCheck();
List<String>[] temp = 
                checks.stream().map((e) -> new String[] {e.getId(), e.getName()}).collect(() -> 
                    {
                        List<String>[] arr = 
                                new ArrayList[2];
                        arr[0] = new ArrayList<>();
                        arr[1] = new ArrayList<>();
                        return arr;
                    }
                , (list, e) -> {
                    list[0].add(e[0]);
                    list[1].add(e[1]);
                }, (list, otherList) -> {
                    list[0].addAll(otherList[0]);
                    list[1].addAll(otherList[1]);
                });
List<String> idListNew = temp[0];
List<String> nameListNew = temp[1];
bwitn5fc

bwitn5fc3#

您还可以组合消费者,例如:

Consumer<Check> idConsumer = ck -> idListNew.add(Check::getId);
Consumer<Check> nameConsumer = ck -> idListNew.add(Check::getName);

checks.stream().forEach(idConsumer.andThen(nameConsumer));
bq9c1y66

bq9c1y664#

Java8流和基于lambda的解决方案,没有副作用。

LocalDateTime newStart = LocalDateTime.now();
List<Check> checks = generateCheck();
List<String> idListNew = checks.stream().map(Check::getId).collect(Collectors.toList());
List<String> nameListNew = checks.stream().map(Check::getName).collect(Collectors.toList());

相关问题