我正在使用java-8修改一个对象。
users.stream().filter(u -> u.count > 0).forEach(u -> u.setProperty("value"))不过,我想知道是否有任何物体被修改过.也就是说,我想要一个布尔返回值,而这是无效的。
有什么办法吗?
发布于 2018-05-17 17:07:13
添加对peek()的调用
AtomicBoolean modified = new AtomicBoolean();
users.stream()
.filter(u -> u.count > 0)
.peek(u -> modified.set(true))
.forEach(u -> u.setProperty("value"))如果有任何元素通过过滤器,modified.get()将返回true。
需要使用AtomicBoolean (或类似的东西),因为在lambdas中使用的引用必须是有效的最终引用。
发布于 2018-05-17 17:08:42
如果我没听错,您想知道在执行操作时是否有匹配。您只需使用两条语句即可。
boolean anyMatch = users.stream().anyMatch(u -> u.count > 0);
if(anyMatch) users.stream().filter(u -> u.count > 0).forEach(u -> u.setProperty("value"));由于anyMatch在第一个匹配元素处停止,只有在第一个匹配之前有一个长前缀的非匹配元素时,才会有多余的工作。
如果这是个问题,你可以用
Spliterator<User> sp = users.stream().filter(u -> u.count > 0).spliterator();
boolean anyMatch = sp.tryAdvance(u -> u.setProperty("value"));
sp.forEachRemaining(u -> u.setProperty("value"));而不是。
发布于 2018-05-17 16:53:24
因为这是一种消耗操作,所以它只能用于那些实际上不返回任何内容的方法;也就是说,使用forEach可以确保终端操作不返回返回值。
如果要验证属性是否按照您希望的方式设置,则必须再次检查元素。
users.stream().filter(u -> u.count > 0)
.allMatch(u -> u.getProperty().equals("value"));虽然这比其他任何东西都更能说明偏执;除非setProperty有其他的副作用而不在此暴露,否则设置者应该始终设置值。为了验证目的,我会在单元测试中编写上面的代码,而不是在生产代码中。
https://stackoverflow.com/questions/50396632
复制相似问题