【发布时间】:2016-12-11 02:00:46
【问题描述】:
我正在尝试将有限数量的值流式传输到一个集合中,但我需要在应用限制之前验证它们是新元素。例如:
Set<Integer> destination = ...
Set<Integer> source = ...
source.stream()
.filter(i -> !destination.contains(i))
.limit(10)
.forEach(destination::add);
但是多余的contains() 检查让我很困扰,因为add() 可以添加元素和 报告它是否是集合中的新元素。所以我想这样做:
source.stream()
.filter(destination::add)
.limit(10)
.forEach(i -> {}); // no-op terminal operation to force evaluation
忽略hacky终端操作,使用带有副作用的过滤器操作存在问题,通常不鼓励这样做。我理解为什么使用map() 和filter() 对并行流有副作用是不安全的。我的问题是,在这种情况下,在顺序流上是否可以接受?如果没有,为什么不呢?
【问题讨论】:
标签: java java-stream side-effects