首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修改和检查是否修改了java-8?

如何修改和检查是否修改了java-8?
EN

Stack Overflow用户
提问于 2018-05-17 16:44:59
回答 3查看 595关注 0票数 4

我正在使用java-8修改一个对象。

代码语言:javascript
复制
users.stream().filter(u -> u.count > 0).forEach(u -> u.setProperty("value"))

不过,我想知道是否有任何物体被修改过.也就是说,我想要一个布尔返回值,而这是无效的。

有什么办法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-17 17:07:13

添加对peek()的调用

代码语言:javascript
复制
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中使用的引用必须是有效的最终引用。

票数 2
EN

Stack Overflow用户

发布于 2018-05-17 17:08:42

如果我没听错,您想知道在执行操作时是否有匹配。您只需使用两条语句即可。

代码语言:javascript
复制
boolean anyMatch = users.stream().anyMatch(u -> u.count > 0);
if(anyMatch) users.stream().filter(u -> u.count > 0).forEach(u -> u.setProperty("value"));

由于anyMatch在第一个匹配元素处停止,只有在第一个匹配之前有一个长前缀的非匹配元素时,才会有多余的工作。

如果这是个问题,你可以用

代码语言:javascript
复制
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"));

而不是。

票数 6
EN

Stack Overflow用户

发布于 2018-05-17 16:53:24

因为这是一种消耗操作,所以它只能用于那些实际上不返回任何内容的方法;也就是说,使用forEach可以确保终端操作不返回返回值。

如果要验证属性是否按照您希望的方式设置,则必须再次检查元素。

代码语言:javascript
复制
users.stream().filter(u -> u.count > 0)
              .allMatch(u -> u.getProperty().equals("value"));

虽然这比其他任何东西都更能说明偏执;除非setProperty有其他的副作用而不在此暴露,否则设置者应该始终设置值。为了验证目的,我会在单元测试中编写上面的代码,而不是在生产代码中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50396632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档