Java dropWhile 不删除列表中的项目

问题描述 投票:0回答:1

我有以下代码片段,输出不会删除列表中带有字符序列“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、

java lambda
1个回答
0
投票

我认为

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();

请参阅此答案了解另一个说明性示例。

© www.soinside.com 2019 - 2024. All rights reserved.