default Stream<T> dropWhile(Predicate<? super T> predicate)
先不讨论其作用,先看看这个方法怎么用,主要是参数predicate,这是个断言,什么意思?就是对错,真假,符合或不符合等等,这个函参返回值必须为布尔值,true表示满足条件,false表示不满足条件。好,现在看看这个方法怎么使用,看个例子:
void stream_dropWhile() {
List<String> list = List.of("I","love","you","and","you","love","me");
Stream<String> stream2 = list.stream().dropWhile(a -> true);
System.out.print("true:");
stream2.forEach(System.out::print);
Stream<String> stream3 = list.stream().dropWhile(a -> false);
System.out.print("\nfalse:");
stream3.forEach(System.out::print);
}
执行结果:
true:
false:Iloveyouandyouloveme
在代码中我们直接强制函参执行结果为true和false,看执行结果返回值true的时候没有打印字符串。从这个例子中我们就很清楚这个方法的用法和作用,用法就不多说了,作用就是遍历集合元素,当函参返回false的时候保留这个元素及后面所有的元素,true的时候不保留,然后继续往下执行直到遇到第一个false或执行玩集合中全部元素。最后把保留的元素放到一个Stream中返回。
其实我们从方法名就可以猜测到这个方法大致作用,就是当函参执行结果为true的时候就drop掉该元素,否则就保留。再看个例子:
Stream<String> stream5 = list.stream().dropWhile(a -> "aaIaandmebbb".contains(a));
System.out.print("\nwhile2:");
stream5.forEach(System.out::print);
执行结果:while2:loveyouandyouloveme
看到了没有,自定义的字符串中有“I”因此集合中第一个元素(“I“)执行函数结果是true,因此这个元素被drop掉,然后继续执行集合后面的元素,集合第二个元素是”love“不包含在字符串中,因此函数结果为false,保留这个元素,这是遇到的第一个false,因此后面元素直接全部保留。即使是后面有元素包含在字符串中也同样保留。
再看下面这个例子:
Stream<String> stream4 = list.stream().dropWhile(a -> "Iloveyouand".contains(a));
执行结果:me
集合中前面6个元素都在字符串中包含,因此函数执行结果一直都是true,所有这些元素都drop掉了,执行到最后一个元素没有在字符串中包含,因此执行结果是false,保留下来,所以最终结果就是me,如果后面还有元素因为已经出现第一个false,因此不做判断也直接保留下来。
这就是stream的短路操作,Omygod,这个方法一不小心就会用错。
再验证一下上面的推测:
Stream<String> stream5 = list.stream().dropWhile(a -> "Iloveyou".contains(a));
System.out.print("\nwhile2:");
stream5.forEach(System.out::print);
执行结果:while2:andyouloveme
看到了没有,前面3个元素都包含,因此被drop掉,第四个元素是“and“,没有被包含,因此保留下来,后面的元素不管是否包含都不再执行判断,直接保留下来。