Java8Lambda高效方法解决方案
我想使用Java8更高效、更清晰地改进代码。有谁能告诉我,所以非常感谢你 我想从生成器提供的检查中获取idList和nameList。 代码在下面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
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,我将尝试它。