理解Java Stream takeWhile:为何这段代码的执行结果符合预期?
Java Stream takeWhile 与终端操作的执行逻辑解析
你对Stream的执行顺序存在误解:Stream不是先批量完成所有中间操作,再统一执行终端操作,而是采用逐个元素流水线式处理的模式——每个元素会依次完成所有中间操作的判断/转换,符合条件的元素会立刻进入终端操作处理,处理完当前元素后才会开始处理下一个元素。
你的代码执行流程拆解:
处理第一个元素
Bill- 经过
takeWhile判断:isJenniferReached初始值为false,!false结果为true,允许元素通过。 - 进入
forEach操作:将Bill 1添加到newPpl,此时未触发Jennifer的判断逻辑,isJenniferReached保持false。
- 经过
处理第二个元素
BobtakeWhile判断:isJenniferReached仍为false,条件成立,元素通过。forEach操作:添加Bob 1到newPpl,isJenniferReached依旧不变。
处理第三个元素
JennifertakeWhile判断:此时isJenniferReached还是false,条件成立,元素通过。forEach操作:先将Jennifer 1添加到newPpl,随后触发判断逻辑,把isJenniferReached设为true。
处理第四个元素
Ben- 进入
takeWhile判断时,isJenniferReached已经是true,!true结果为false,takeWhile会直接终止整个流的处理,因此Ben不会进入forEach操作。
- 进入
补充说明:
这里使用AtomicBoolean是因为Lambda表达式无法直接修改外部的普通boolean变量(Java中基本类型是值传递,Lambda只能访问final或等效final的变量),而AtomicBoolean是引用类型,既能在Lambda中修改状态,又保证了线程安全(虽然这段代码是单线程执行,用volatile boolean也能达到效果,但AtomicBoolean是更规范的写法)。
内容的提问来源于stack exchange,提问作者Lior Derei
相关产品推荐
相关产品推荐

