我有一个列表,我想在其中过滤元素并对每个元素应用方法,并将结果添加到另一个列表myFinalList中.

有了Java8,我发现我可以用两种不同的方式来实现它.我想知道他们之间更有效的方式,并理解为什么一种方式比另一种更好.

我愿意接受任何关于第三条道路的建议.

方法1:

myFinalList = new ArrayList<>();
myListToParse.stream()
        .filter(elt -> elt != null)
        .forEach(elt -> myFinalList.add(doSomething(elt)));

方法2:

myFinalList = myListToParse.stream()
        .filter(elt -> elt != null)
        .map(elt -> doSomething(elt))
        .collect(Collectors.toList()); 

推荐答案

不要担心任何性能差异,在这种情况下,它们通常是最小的.

方法2更可取,因为

  1. 它不需要对lambda表达式之外的集合进行变异.

  2. 它更具可读性,因为在收集管道中执行的不同步骤是按顺序编写的:首先是过滤操作,然后是映射操作,然后是收集结果(有关收集管道好处的更多信息,请参阅Martin Fowler的excellent article)

  3. 通过替换使用的Collector,可以轻松更改收集值的方式.在某些情况下,您可能需要编写自己的Collector,但这样做的好处是您可以轻松地重用它.

Java相关问答推荐

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

如何以干净的方式访问深度嵌套的对象S属性?

Spring Boot@Cachebale批注未按预期工作

Java中的死锁及其重入锁和锁

使用Spring Boot3.2和虚拟线程的并行服务调用

如何在ApachePOI中将图像添加到工作表的页眉?

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

什么是Java原子属性的正确getter和setter

Spring @Value default无法计算表达式

如何对多个字段进行分组和排序?

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

Java中将文本拆分为数字或十进制数字和字符串

Java构造函数分支

如何在JUNIT测试中覆盖ExecutorService?

Java 21中泛型的不兼容更改

循环不起作用只有第一个元素重复

JXBrowser是否支持加载Chrome扩展?

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

try 添加;按流派搜索;在Web应用程序上,但没有;I don’我不知道;It’这个代码错了