Stream 流的使用

  • Stream 关注的是对数据的运算,和 cpu 打交道,而集合关注的则是数据的存储,与内存打交道
  • stream 自己不会存储元素
  • stream 不会改变源对象,相反,他会返回一个持有结果的新的 stream
  • stream 操作是执行的,这意味着他们会等到需要结果的时候才执行
  • 执行流程
    1. stream 的实例化
    1. 中间的一系列操作(过滤,映射
    1. 终止操作
  • 说明 :
    1. 一个中间操作链,对数据源的数据进行处理
    1. 一旦执行终止操作,就执行中间的操作链,并产生结果集,之后不再被使用

两个工具类:
Student:

public class Student {

    int no;
    String name;
    String sex;
    float height;

    public Student(int no, String name, String sex, float height) {
        this.no = no;
        this.name = name;
        this.sex = sex;
        this.height = height;
    }

    @Override
    public String toString() {
        return "Student{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", height=" + height +
                '}';
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public float getHeight() {
        return height;
    }

    public void setHeight(float height) {
        this.height = height;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return no == student.no &&
                Float.compare(student.height, height) == 0 &&
                Objects.equals(name, student.name) &&
                Objects.equals(sex, student.sex);
    }

    @Override
    public int hashCode() {
        return Objects.hash(no, name, sex, height);
    }
}

ListAddUtil:

public class ListAddUtil {

    public static List<Student> addObject(){
        Student stuA = new Student(1, "A", "M", 184);
        Student stuB = new Student(2, "B", "G", 163);
        Student stuC = new Student(3, "C", "M", 175);
        Student stuD = new Student(4, "D", "G", 158);
        Student stuE = new Student(5, "E", "M", 170);
        List<Student> list = new ArrayList<>();
        list.add(stuA);
        list.add(stuB);
        list.add(stuC);
        list.add(stuD);
        list.add(stuE);
        return list;
    }

}

 
 

1. 创建流的四种方式
public class StreamApi {


    // 创建 stream 方式一:通过集合
   @Test
    public void test(){
      List<Student> students = ListAddUtil.addObject();

      // 该结果返回一个顺序流
      Stream<Student> stream = students.stream();

      //返回一个并行流
      Stream<Student> studentStream = students.parallelStream();
   }

   // 创建 stream 方式二:通过数组创建

   public void test1(){
      int[] ints = {1, 2, 3, 4};

      IntStream stream = Arrays.stream(ints);
   }

   // 创建 stream 方式三:通过 stream 的 of 方式
   @Test
   public void test2(){
      Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6, 7);
   }

   // 创建 stream 方式四:创建无线流
   @Test
   public void test3(){

      // 迭代
      // 遍历前十个偶数
      Stream.iterate(0,num->num+2).limit(10).forEach(System.out::println);

      // 生成
      Stream.generate(Math::random).forEach(System.out::println);

   }

}

 
 

2. Stream 中间操作

 
筛选与切片:

@Test
    public void test() {
        List<Student> students = ListAddUtil.addObject();
        // filter,从流中排出某些元素
        Stream<Student> stream = students.stream();
        stream.filter(s -> s.getSex().equals("M")).forEach(System.out::println);

        System.out.println("*********************************************");

        // limit 截断流 使其元素不超过给定的数量
        students.stream().limit(2).forEach(System.out::println);

        System.out.println("*********************************************");
        // skip(n) 跳过元素,返回一个扔掉前 n 个元素的流,若元素不足 n 个 ,则返回一个空流
        students.stream().skip(3).forEach(System.out::println);

        // distinct() 筛选,通过流生成元素的 hashCode() 和 equals() 去除重复的元素

        System.out.println("************************");

        students.add(new Student(1, "A", "M", 184));
        students.add(new Student(1, "A", "M", 184));
        students.add(new Student(1, "A", "M", 184));
//        System.out.println(students.size());
        students.stream().distinct().forEach(System.out::println);


    }

 
映射:

 @Test
    public void test1() {

        // map(Function f) 接受一个函数作为参数,将元素转换成其他形式或提取信息
        List<String> list = Arrays.asList("aa", "bb", "cc");
        list.stream().map(String::toUpperCase).forEach(System.out::println);

        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");

        List<Student> students = ListAddUtil.addObject();

        students.stream().map(Student::getName).filter(s -> s.equals("A")).forEach(System.out::println);

        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");

        Stream<Stream<Character>> streamStream = list.stream().map(StreamApi1::fromStringToStream);

        streamStream.forEach(s -> s.forEach(System.out::println));


        // flatMap(Function f) 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有的流连接成一个流
        System.out.println("》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》");
        Stream<Character> characterStream = list.stream().flatMap(StreamApi1::fromStringToStream);
        characterStream.forEach(System.out::println);

    }

    // 将字符串中的多个字符构成的集合转换为对应的 steam 流实例

    public static Stream<Character> fromStringToStream(String s) {
        ArrayList<Character> arrayList = new ArrayList<>();

        for (char c : s.toCharArray()) {
            arrayList.add(c);
        }

        return arrayList.stream();

    }


    @Test
    public void test3() {
        List list1 = new ArrayList();
        list1.add(1);
        list1.add(2);
        list1.add(3);


        List list2 = new ArrayList();
        list2.add(4);
        list2.add(5);
        list2.add(6);

        //list1.add(list2);
        list1.addAll(list2);
        System.out.println("list1 = " + list1);
        System.out.println("list2 = " + list2);
    }


 
排序:

 // 排序
    @Test
    public void test4(){
        // sorted() 自然排序
        List<Integer> integerList = Arrays.asList(12, 56, 34, 78, 1, 102);
        integerList.stream().sorted().forEach(System.out::println);
        System.out.println("***************************************************");
//       出现异常,原因没有实现 Comparable 接口
//        List<Student> students = ListAddUtil.addObject();
//        students.stream().sorted().forEach(System.out::println);


        // sorted(Comparator com) 定制排序
        List<Student> students = ListAddUtil.addObject();
//        students.stream().sorted((s1,s2)->
//            Double.compare(s1.getHeight(),s2.getHeight())
//        ).forEach(System.out::println);

        students.stream().map(Student::getHeight).sorted(Double::compare).forEach(System.out::println);

    }

 
 

3. stream 的终止操作

 
匹配和查找:

 @Test
    public void test() {
        List<Student> students = ListAddUtil.addObject();
        // allMatch 检查是否匹配所有元素
        // 所有元素的 NO 是否大于 10
        boolean allMatch = students.stream().allMatch(student -> student.getNo() > 0);
        System.out.println("allMatch = " + allMatch);

        System.out.println("******************************");

        // anyMatch 检查是否至少匹配一个元素
        boolean anyMatch = students.stream().anyMatch(student -> student.getNo() > 4);
        System.out.println("anyMatch = " + anyMatch);

        System.out.println("******************************");

        // noneMatch 检查是否没有匹配的元素
        boolean noneMatch = students.stream().noneMatch(student -> student.getName().equals("A"));
        System.out.println("noneMatch = " + noneMatch);

        System.out.println("******************************");

        // findFirst 返回第一个元素
        Optional<Student> first = students.stream().findFirst();
        System.out.println("first = " + first);

        System.out.println("******************************");

        // findAny 返回当前流中的任意一个元素
        Optional<Student> any = students.parallelStream().findAny();
        System.out.println("any = " + any);

        System.out.println("******************************");

        // count 返回流中元素的总数
        long count = students.stream().filter(student -> student.getNo() > 2).count();
        System.out.println("count = " + count);

        System.out.println("******************************");

        // max 返回流中最大值
        Stream<Float> floatStream = students.stream().map(student -> student.getHeight());
        System.out.println(floatStream.max(Double::compare));

        System.out.println("******************************");

        // min  返回流中最小值
        Optional<Student> max = students.stream().min((s1, s2) -> Double.compare(s1.getHeight(), s2.getHeight()));
        System.out.println("max = " + max);

        System.out.println("******************************");

        // forEach 内部迭代
        students.stream().forEach(System.out::println);
        // 使用集合的遍历操作
        students.forEach(System.out::println);

    }

 
约规:

 @Test
    public void test2(){
        // reduce(T identity, BinaryOperation) 可以将流中的元素反复结合起来,得到一个值
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4);
        Integer reduce = integerList.stream().reduce(10, Integer::sum);
        System.out.println("reduce = " + reduce);

        // reduce(BinaryOperation) 可以将流中的元素反复结合起来,得到每一个值,返回一个 Optional<T>

        List<Student> students = ListAddUtil.addObject();
        // 方式一:
       // Optional<Float> reduce1 = students.stream().map(Student::getHeight).reduce((h1, h2) -> h1 + h2);

        Optional<Float> reduce1 = students.stream().map(Student::getHeight).reduce(Float::sum);
        System.out.println(reduce1);

    }

 

收集:

@Test
    public void test4(){
        // collect(Collector c) 将流转换为其他形式

        List<Student> students = ListAddUtil.addObject();
        List<Student> collect = students.stream().filter(student -> student.getNo()>3).collect(Collectors.toList());
        collect.forEach(System.out::println);

        System.out.println("**************************");

        students.stream().collect(Collectors.toSet()).forEach(System.out::println);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光头小小强007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值