Java中Stream的dropWhile方法未移除列表含'c'元素的问题咨询
Java中Stream的dropWhile方法未移除列表含'c'元素的问题咨询
嗨,我来帮你理清楚这个问题的原因~
你遇到的问题其实是对dropWhile方法的作用理解有偏差啦!dropWhile并不是移除所有满足条件的元素,它的逻辑是:从流的开头开始,连续丢弃满足条件的元素,直到遇到第一个不满足条件的元素,之后的所有元素都会被保留,不管它们是否符合条件。
结合你的代码来看:
你的列表是["abc", "cde", "dea", "dei", "mod", "loc", "bpa"],当调用dropWhile(name -> name.contains("c"))时:
- 第一个元素
abc含'c',被丢弃 - 第二个元素
cde含'c',被丢弃 - 第三个元素
dea不含'c',这时候dropWhile就停止工作了!后面的所有元素(包括loc,虽然它含'c')都会被原封不动地保留下来,所以你的输出里才会出现loc。
如果你的需求是移除所有包含'c'的元素,那应该用filter方法,它会过滤掉流中所有满足条件的元素,不管它们在列表中的位置。修改后的代码如下:
final List<String> threeLetters = List.of("abc", "cde", "dea", "dei", "mod", "loc", "bpa"); threeLetters.stream() .filter(name -> !name.contains("c")) // 过滤掉所有含'c'的元素 .map(name -> name + ", ") .forEach(System.out::print); System.out.println();
这段代码的输出就会是dea, dei, mod, bpa,,完全移除了所有含'c'的元素,符合你的预期。
备注:内容来源于stack exchange,提问作者noob Coder
相关产品推荐
相关产品推荐

