如何使用Java streams实现传统for循环的等价代码
Java for循环转Stream等价实现
原逻辑说明
原代码逻辑如下:
- 遍历
studentKeys集合中的所有学生ID - 只要存在任意一个ID不等于当前
student的ID,就将标记位present设为true - 每个符合上述判断条件的ID都会触发一次debug日志打印
- 遍历会执行完集合中所有元素,不会中途终止
完全等价的Stream实现
由于Java Stream不允许修改外部非final变量,我们使用AtomicBoolean来存储标记位,实现完全和原循环一致的效果:
import java.util.concurrent.atomic.AtomicBoolean; // ... AtomicBoolean present = new AtomicBoolean(false); studentKeys.stream() .filter(studentKey -> !studentKey.equals(student.getId())) .forEach(matchedKey -> { present.set(true); log.debug(STR_SESSION_BLOCKED_ANOTHER_USER); }); // 后续使用present.get()获取最终的布尔标记值
简化实现(仅需判断存在性时使用)
如果你不需要为每一个符合条件的元素打印日志,只需要判断是否存在符合条件的元素,可以用更简洁的anyMatch写法,性能更高,匹配到第一个符合条件的元素就会终止遍历:
boolean present = studentKeys.stream() .anyMatch(studentKey -> !studentKey.equals(student.getId())); // 匹配到第一个符合条件的元素时可以自己加日志,仅打印一次 if (present) { log.debug(STR_SESSION_BLOCKED_ANOTHER_USER); }
内容的提问来源于stack exchange,提问作者Developer and Thinker
相关产品推荐
相关产品推荐

