【发布时间】:2017-07-18 17:02:11
【问题描述】:
我想知道从 java 流中设置布尔标志值的最佳实践是什么。这是我想做的一个例子:
List<Integer> list = Arrays.asList(1,2,3,4,5);
boolean flag = false;
List<Integer> newList = list.stream()
//many other filters, flatmaps, etc...
.filter(i -> {
if(condition(i)){
flag = true;
}
return condition(i);
})
//many other filters, flatmaps, etc...
.collect(Collectors.toList());
//do some work with the new list and the flag
但是,这违反了语言限制“在 lambda 表达式中使用的变量应该是最终的或有效的最终”。我能想到一些解决方案,但我不确定哪个是最好的。我的第一个解决方案是将匹配condition 的元素添加到列表中并检查List::isEmpty。也可以将flag 包裹在AtomicReference 中。
请注意,我的问题与question 类似,但我试图在最后提取一个布尔值,而不是设置一个变量。
【问题讨论】:
-
这不是建议,这是语言限制。
-
也可以将
flag包裹在AtomicReference中。 或AtomicBoolean? -
您的第一个解决方案看起来非常好:检查 isEmpty 似乎是正确的方法。
-
修复它@shmosel
-
任何阅读这篇文章的人都不应该认为这是一个“好主意”,即具有来自
filter()的副作用。 OP 应该发布更多代码,因为问题可能可以更优雅地解决并符合函数式编程最佳实践(例如使用findAny())
标签: java java-8 java-stream