Java 8中如何修改对象并判断是否有对象被修改?
实现带布尔返回值的对象修改判断
嘿,这个需求很实用,我给你两个简洁的解决方案,既能完成对象修改,又能知道是否有对象被改动:
方案一:用peek() + findAny().isPresent()
这个方法直接返回是否存在被修改的对象,代码如下:
boolean hasModified = users.stream() .filter(u -> u.count > 0) .peek(u -> u.setProperty("value")) // 在这里执行对象修改操作 .findAny() .isPresent(); // 如果有元素经过filter并被peek处理,就返回true
原理说明:
filter(u -> u.count > 0):先筛选出需要修改的对象;peek():作为中间操作,对每个符合条件的对象执行修改(它不会终止流,所以可以继续后续操作);findAny().isPresent():判断流中是否存在经过筛选的元素,也就是是否有对象被修改。
方案二:用peek() + count()获取修改数量
如果你不仅想知道是否有修改,还想知道具体修改了多少个对象,可以用这个方案:
long modifiedCount = users.stream() .filter(u -> u.count > 0) .peek(u -> u.setProperty("value")) .count(); boolean hasModified = modifiedCount > 0;
这个方法通过count()统计被修改的对象数量,再判断数量是否大于0来得到布尔结果。
注意事项:
peek()虽然常被用于调试,但在这里修改对象状态是合法的(只要你是串行流,并行流的话要注意对象的线程安全性);- 避免直接用
forEach()后再重新遍历一次判断,那样会多一次遍历,效率更低。
内容的提问来源于stack exchange,提问作者Tanvi Jaywant
相关产品推荐
相关产品推荐

