Java Stream.dropWhile()不';t返回两个不同值中的正确值

Java Stream.dropWhile()不';t返回两个不同值中的正确值,java,java-stream,java-9,Java,Java Stream,Java 9,我试图学习Java-9中的新特性,我逐渐了解了流的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) {

我试图学习Java-9中的新特性,我逐渐了解了流的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);

    }
}
我认为在第一个条件下,它应该打印[世界]。 提前感谢。

美国的Javadoc:

如果此流已排序,则返回一个流,该流在删除与给定谓词匹配的元素的最长前缀后由该流的其余元素组成

在第一个代码段中,
流的第一个元素
不满足
a->a.isEmpty()
,因此不会删除任何元素

在第二个代码片段中,
流中的前3个元素满足
d->!d、 isEmpty()
,因此这3个元素被删除,留下
“e”
&
“f”
,Java 9中引入的将删除匹配谓词的最长起始元素集

如果此流已排序,则返回一个流,该流在删除与给定谓词匹配的元素的最长前缀后由该流的其余元素组成

因为您的条件是项目为空,并且第一个项目不是空的,所以不会删除任何内容,从而使
[“Hello”、“”、“World”]
保持不变

最后,当您使用相反的条件调用
dropWhile
时,它不是空的,前3项匹配并被删除,剩下的
[“”,“e”,“f”]


这是预期的行为。

第一个条件是在找到非空项之前删除项,第二个条件是在找到空项之前删除项。添加一个“!”为了更好地理解算法,您可以尝试替换
版本:

List<String> value = Stream.of(s).dropWhile(String::isEmpty).collect(Collectors.toList());

我怀疑的是,在第一个条件中,它只返回Hello,并且应该删除左两个值。不是吗?只要提供的条件为真,“dropWhile”就会运行。当条件为false时,它停止。在第一个循环中,条件从一开始就是false。在第二个循环中,流的两个元素也是如此。@HarshKumrawat他说的是,当你想
的时候,你就把
a.isEmpty()!a、 isEmpty()
。这就是为什么输出不是您所期望的。我怀疑的是,在第一种情况下,它只返回Hello,并且应该删除左两个值。是吗?@HarshKumrawat Nothing应该被删除,因为“匹配给定谓词的元素的最长前缀”是空的。我怀疑的是,在第一个条件中,它只返回Hello,并且应该删除剩下的两个值。是吗?@HarshKumrawat不应该删除任何内容,因为“匹配给定谓词的元素的最长前缀”是空的。因为我正在学习流功能,所以我只想使用流方法。感谢您的回答这只是从不同角度来看:)。。。继续学习!我怀疑的是,在第一个条件中,它只返回Hello,并且应该删除左两个值。不是吗?
List<String> value = Stream.of(s).dropWhile(String::isEmpty).collect(Collectors.toList());
List<String> value = new ArrayList<>();
boolean dropping = true;

for (int i = 0; i < s.length; i++) {
    String str = s[i];
    if (dropping) {
        if (str.isEmpty()) {
            continue;
        }
        dropping = false;
    }
    value.add(str);
}