stream流的学习笔记

使用stream流的好处

stream流是从jdk8之后才有的,其功能是对数组/列表中的元素进行操作,再此之前这个任务都是使用foreach来完成的,stream代替foreach的一个重要原因就是简洁

int[] list={1,2,3,4,5,6,7,8,9};
//打印这个数组中大于4的数字

使用foreach来完成这个任务

public class sudent {
    public static void main(String[] args) {
       int[] list={1,2,3,4,5,6,7,8,9};
        for (int i : list) {
            if (i>4){
                System.out.println(i);
            }
        }
    }
}

使用stream流来完成这个任务

public class sudent {
    public static void main(String[] args) {
        Stream.of(1,2,3,4,5,6,7,8,9).filter(i->i>4).forEach(System.out::println);
    }
}

加粗样式## 创建stream流对象

  • 使用stream中的静态方法of(将数组转成stream)
public static<T> Stream<T> of(T... values)
  • collection接口中的stream方法
default Stream<E> stream()

stream中的的方法

  • 延迟方法

    1. filter(),参数为predicate函数接口,可以通过lambda传递,其中test方法接收这个流中的元素,返回boolean类型的值,如果方法返回是false该元素就会被过滤
    2. map(),参数是function函数接口,接收流中的元素,返回任何类型的值
    3. limit(),接收一个long类型的数n,只要前n个元素
    4. skip(),接收一个long类型的数n,跳过前n个元素
    5. concat(),将两个stream流合并再一次,返回一个新的流
  • 终结方法

    1. forEach(), 方法接收一个consumer的函数式接口,返回值为void,方法的一般写对元素的使用
    2. count(), 方法返回流中的所有元素的个数

    用表格的形式
    在这里插入图片描述

一个流只能使用一次,如

public class sudent {
   public static void main(String[] args) {
       Stream<Integer> stream = Stream.of(1, 2, 34, 4);
       Stream<Integer> stream2 = stream.filter(integer -> integer > 4);
       System.out.println(stream.count());
   }
}

其中stream先是调用了filer方法将流中小于等于4的元素过滤掉,然后第二次调用的方法count,就会报一个IllegalStateException异常

stream中方法实现的细节

先看下面这段代码

import java.util.stream.Stream;

public class sudent {
    public static void main(String[] args) {
        Stream<Integer> stream = Stream.of(1, 2,3,4,5,6,7,8,9);
        Stream<Integer> stream1 = stream.filter(i -> {
            System.out.println("我是:"+i+"这是第一个filter");
            return i > 2;//过滤掉小于等于2的元素
        });
        Stream<Integer> stream2 = stream1.filter(i -> {
            System.out.println("我是:"+i+"这是第二个filter");
            return i > 4;//过滤掉小于等于4的元素
        });
        stream2.forEach(System.out::println);//传递方法,打印剩下的元素
    }
}

猜测程序是所有元素执行完了第一个filter方法后在执行第二filter方法
还是对第一个元素执行完了第一个filter方法在对其执行第二个filter方法在在执行foreach方法(假设这个元素可以通过第一个和第二个filter方法)
结果为

我是:1这是第一个filter
我是:2这是第一个filter
我是:3这是第一个filter
我是:3这是第二个filter
我是:4这是第一个filter
我是:4这是第二个filter
我是:5这是第一个filter
我是:5这是第二个filter
5
我是:6这是第一个filter
我是:6这是第二个filter
6
我是:7这是第一个filter
我是:7这是第二个filter
7
我是:8这是第一个filter
我是:8这是第二个filter
8
我是:9这是第一个filter
我是:9这是第二个filter
9

如果是第一种结果就应该是:
上面全是:我是:*这是第一个filter
中间是: 我是:*这是第二个filter
最后是:数字
而这个结果显然是符合第二种猜想的
可以看作:一条流水线上同时只有一个产品,等这个产品制作完成,或是被淘汰才会开始制作下一个产品

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值