首页 > 解决方案 > Stream.dropWhile() 不会以两个不同的值返回正确的值

问题描述

我正在尝试学习 Java-9 中的新功能,我开始了解 Stream 的 dropWhile 方法,但它在两种不同的场景中返回不同的值。这是我的代码

package src.module;

import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.List;

public class Test {

    public static void main(String[] args) {

        String s[] = new String[3];
        s[0] = "Hello";
        s[1] = "";
        s[2] = "World";
        List<String> value = Stream.of(s).dropWhile(a -> a.isEmpty()).collect(Collectors.toList());

        System.out.println(value);

        List<String> values = Stream.of("a", "b", "c", "", "e", "f").dropWhile(d -> !d.isEmpty())
                .collect(Collectors.toList());
        System.out.println(values);

    }
}

这是我得到的答案

[Hello, , World]
[, e, f]

我认为在第一个条件下它应该打印 [,World]。提前致谢。

标签: javajava-streamjava-9

解决方案


Java 9 中引入的dropWhile方法将删除与谓词匹配的最长起始元素集。

如果此流是有序的,则在删除与给定谓词匹配的元素的最长前缀后,返回由该流的剩余元素组成的流。

因为您的条件是该项为空,且第一项不为空,所以什么都没有删除,保持["Hello", "", "World"]原样。

最后,当您dropWhile使用相反的条件调用时,不为空,前 3 个项目匹配并被删除,["", "e", "f"]剩下的项目是剩余的项目。

这是预期的行为。


推荐阅读