Java8Lambda高效方法解决方案

Java8Lambda高效方法解决方案,java,spring,java-8,java-stream,Java,Spring,Java 8,Java Stream,我想使用Java8更高效、更清晰地改进代码。有谁能告诉我,所以非常感谢你 我想从生成器提供的检查中获取idList和nameList。 代码在下面 LocalDateTime newStart = LocalDateTime.now(); List<Check> checks = generateCheck(); List<String> idListNew = new ArrayList<>(); List<String> nameListNew

我想使用Java8更高效、更清晰地改进代码。有谁能告诉我,所以非常感谢你 我想从生成器提供的检查中获取idList和nameList。 代码在下面

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


基于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());

上述答案相同,但性能更有效:

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

如果您碰巧使用Java 12或更高版本,则可以使用T形收集器:

合并m=checks.stream .收藏 mappingCheck::getId,toList, mappingCheck::getName,toList, 合并:新的; System.out.printlnm.ids; System.out.printlnm.names; 映射、teeing和toList是从java.util.stream.collector静态导入的

其中,合并是以下形式的容器类:

私有静态记录合并列表ID,列表名称{} //自Java15以来,记录是一种语言特性。否则,你可以改为 //自己编写这个类: 阶级合并{ 列出ID; 列出姓名; //所有args构造函数和getter } //或者您可以只使用现有的类型,如Map.Entry或Pair。
上述解决方案的优点是它只遍历列表一次,否则,如果列表非常大,就会造成性能损失。您自己的解决方案在这方面也有相同的优势。

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

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

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

我想你已经有了有效的方法考虑迭代一次与两次作为一种折衷,newStart需要什么?我想你的意思是有效,我们的代码已经有效了。使用List idListNew=new ArrayListchecks.size;List nameListNew=new ArrayListchecks.size;使用所需容量初始化列表。除此之外,没有机会提高性能。Thak you’通过考虑原始版本的性能,您认为这是一种有效的方法solution@janith1024我认为这在性能上确实更好,因为t涉及流,它还提供了额外的灵活性。迭代两次,我缓慢地对其进行了测试,虽然此解决方案可能无效,但我非常感激。@janith1024原始解决方案会产生副作用,这在使用Streams时是一个很大的禁忌。流并不完全与性能有关。流允许声明式的编程方式做什么,而不是命令式的编程方式如何做。简单for循环比streams快得多,但是在编写循环逻辑时可能会犯很多错误。当您真正想从1循环到10时,可以启动int i=1的for循环,并将退出条件设置为i<10。阅读更多信息,我很抱歉,我会告诉你,当我测试它时,它会更慢。顺便说一句,非常感谢。我从你的解决方案中学到了更多的操作。非常感谢。谢谢你们帮助我更好地了解消费者。非常感谢。如果我正在使用Java12,我将尝试它。