Stream.dropWhile

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“,没有被包含,因此保留下来,后面的元素不管是否包含都不再执行判断,直接保留下来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值