【发布时间】:2016-06-12 14:20:27
【问题描述】:
给定一个元素列表,我想获取具有给定属性的元素并将其从列表中删除。我找到的最佳解决方案是:
ProducerDTO p = producersProcedureActive
.stream()
.filter(producer -> producer.getPod().equals(pod))
.findFirst()
.get();
producersProcedureActive.remove(p);
是否可以在 lambda 表达式中组合 get 和 remove?
【问题讨论】:
-
这似乎是一个经典案例,什么时候只使用循环和迭代器。
-
@chrylis 我很不同意 ;) 我们已经习惯了命令式编程,以至于任何其他方式听起来都太奇特了。想象一下,如果现实是相反的:我们非常习惯于函数式编程,而新的命令式范式被添加到 Java 中。你会说这将是流、谓词和可选项的经典案例吗?
-
不要在这里打电话给
get()!你不知道它是否为空。如果该元素不存在,您将引发异常。相反,请使用 ifPresent、orElse、orElseGet 或 orElseThrow 等安全方法之一。 -
@FedericoPeraltaSchaffner 可能是口味问题。但我也建议不要将两者结合起来。当我看到一些代码使用流获取值时,我通常假设流中的操作没有副作用。混合删除元素可能会导致代码误导读者。
-
澄清一下:您要删除
list中Predicate为真的所有元素还是仅删除第一个(可能为零、一个或多个元素)?
标签: java lambda java-8 java-stream