我有以下代码片段,输出不会删除列表中带有字符序列“c”的最后一个字符串。 dropWhile 应该删除列表中所有带有字符序列“c”的字符串?
final List<String> threeLetters = List.of("abc", "cde", "dea", "dei", "mod", "loc", "bpa");
threeLetters.stream()
.dropWhile(name -> name.contains("c"))
.map(name -> name + ", ")
.forEach(System.out::print);
System.out.println();
输出是
dea、dei、mod、loc、bpa、
我不满意输出包含三个字母“loc”。我正在使用 java 11.0.14 2022.01.18 LTS。 有什么解释可能发生这种情况吗?
dei、dea、mod、loc、bpa、
我认为
filter
更适合您的情况。只要特定条件成立,dropWhile
就会掉落物品。一旦这个条件第一次不成立,此后就会停止下降。 filter
相反,会从流中删除所有不满足条件的项目。
就你而言,
abc -> name.contains("c") is true -> drop
cde -> name.contains("c") is true -> drop
dea -> name.contains("c") is false -> stop dropping
dei -> output
mod -> output
loc -> output
bpa -> output
相比之下,
filter
的工作原理如下:
abc -> name.contains("c") is true -> drop
cde -> name.contains("c") is true -> drop
dea -> name.contains("c") is false -> output
dei -> name.contains("c") is false -> output
mod -> name.contains("c") is false -> output
loc -> name.contains("c") is true -> drop
bpa -> name.contains("c") is false -> output
因此,您可能想要的是:
final List<String> threeLetters = List.of("abc", "cde", "dea", "dei", "mod", "loc", "bpa");
threeLetters.stream()
.filter(name -> name.contains("c"))
.map(name -> name + ", ")
.forEach(System.out::print);
System.out.println();
请参阅此答案了解另一个说明性示例。