• java 20 Stream流


    一.Stream

    1.所在包

    import java.util.stream.*;

    2.中间方法与终端方法

    //中间方法返回的stream类型 可以连续调用

    //终端方法--》返回类型肯定不是Steam  【long void Optional int ....

    //中间方法必须以终端方法收尾才能执行

    //否则中间方法不执行

    //终端方法后面肯定没有方法吗? XXXX的

    //filter((T x)->{return boolean });  断言型接口

     

    3.特点

    内部迭代 惰性求值 函数编程

    4.Filter  断言型编程

    符合条件的进入stream流 中间方法

    5.Limit(long maxSize) 保留maxSize个元素 中间方法

    1. Stream filter(Predicatesuper T> predicate)
    2. 返回由与此给定谓词匹配的此流的元素组成的流。
    1. ArrayList list = new ArrayList<>();
    2. Student s1 = new Student("Lee",21,77);
    3. Student s2 = new Student("Andy",25,76);
    4. Student s3 = new Student("Joker",20,58);
    5. Student s4 = new Student("Andy",25,76);
    6. Collections.addAll(list,s1,s2,s3,s4);
    7. // 打印两位大于60分的学生
    8. //过滤 filter出 元素
    9. //截断 保留元素
    10. //打印
    11. /*list.stream()
    12. .filter((stu)->{return stu.getScore()>60;})
    13. .limit(2)
    14. .forEach((stu)->{System.out.println(stu);});*/
    15. //简化
    16. list.stream()// 泛型Student 返回Stream
    17. .filter(stu->stu.getScore()>60)// 泛型Student 返回Stream
    18. .limit(4)// 泛型Student 返回Stream
    19. //如果使用方法引用的话需要方法覆盖Student的toString
    20. //void accept (T x)
    21. //void println 一个
    22. .forEach(System.out::println);

    6.Stream distinct() 中间方法

    如果是用在引用数据类型中要重写 hashCode equals方法

    去重用的 底层是 hashCode == equals

    1. ArrayList list = new ArrayList<>();
    2. Student s1 = new Student("Lee",21,77);
    3. Student s2 = new Student("Andy",25,76);
    4. Student s3 = new Student("Joker",20,58);
    5. Student s4 = new Student("Andy",25,76);
    6. Collections.addAll(list,s1,s2,s3,s4);
    7. //去重
    8. list.stream()
    9. .distinct()//底层不是equals 底层是hashCode == euqals
    10. .forEach(System.out::println);

    7. Stream map(FunctionT,? extends R> mapper)  apply应用

    四大接口之一的Function

    抽象方法 R apply(T)对元素中每一个进行类型转换  将T类型->R类【基本数据类型是包装类】

    1. //打印不及格的成绩
    2. list.stream()//getScore
    3. .map((stu)->{return stu.getScore();})//将Student类型---》Integer类型
    4. .filter((score)->{return score<60;})//过滤出不及格的成绩Student对象们 stream返回类型
    5. .forEach((x)->{System.out.println(x);});
    6. //简化
    7. list.stream()//调用stram流
    8. // Integer apply (Student)
    9. //Integer getScore() 符合 类::实例方法
    10. // Student::getScore() 类::实例方法
    11. //下面可改成方法引用
    12. .map(stu->stu.getScore()) //.map(Student::getScore)//将Student对象转为Integer对象
    13. .filter(score->score<60)//过滤Integer对象中不及格的元素
    14. .forEach(System.out::println);//打印出不及格的元素分数

    面试题:【两个重点的东西】

    Stream中filter和map的区别?

    Filter((x)->{return boolean;});  个数

    流元素的个数可能改变 但是元素的类型肯定不变

    Map((x)->{return R}); 映射类型

    流中的元素个数肯定不变 但是元素的类型可能改变

     8.Stream中的Stream<> sorted  中间方法 可以对集合的元素进行排序

    1. ArrayListlist_1=new ArrayList<>();
    2. Collections.addAll(list_1,100,25,65,18,78);
    3. //Stream中的Stream<> sorted 中间方法 可以对集合的元素进行排序
    4. list_1.stream()
    5. .sorted()//按照类的自定义自然顺序进行排序for则会.ClassCastException
    6. .forEach(System.out::println);

    9. Stream 中Stream sorted(Comparator comparator)

    1. list_1.stream()
    2. .sorted((x,y)->{return y-x;})//有参的soretd
    3. .forEach(System.out::println);

    练习 sorted()和 sorted(ComapreTor)

    1. ArrayList list = new ArrayList<>();
    2. Student s1 = new Student("Lee",21,77);
    3. Student s2 = new Student("Andy",25,76);
    4. Student s3 = new Student("Joker",20,58);
    5. Student s4 = new Student("Andy",25,76);
    6. Collections.addAll(list,s1,s2,s3,s4);
    7. //降序打印分数
    8. list.stream()
    9. .map((stu)->{return stu.getScore();})
    10. .sorted((x,y)->{return y-x;})//比较器--->lambda表达
    11. .forEach(System.out::println);
    12. //升序打印分数
    13. list.stream()
    14. .map((stu)->{return stu.getScore();})//将student-》Integer类型
    15. .sorted()//默认类型的compareTo
    16. .forEach(System.out::println);

    //按照名字升序 需要在Student类进行compareTo的重写

    1. //按照姓名升序打印
    2. list.stream()
    3. //两个参数 int compare X Y
    4. //一个参数 int compareTo x
    5. //.sorted((n,old)-> n.getName().compareTo(old.getName()))
    6. //.sorted((n,old)->{return n.getName().compareTo(old.getName());})
    7. //简化 后 类::实例方法
    8. .sorted(Student::compareTo)
    9. .forEach((stu)->{System.out.println(stu.getName());});
    10. Student类:Comparable
    11. @Override
    12. public int compareTo(Student s1){
    13. return this.name.compareTo(s1.name);
    14. }

    FlatMap  不是很重要 不需要掌握下面这两个

    generate(()->{return xxx;}) 与 limit一起

    Iterate(初始值,(x)->{x+1})与 limit一起

    Stream.generate().limit(个数).forEach()  产生无数个相同的内容,结合limit 来使用

    Stream.iterate(0 初始值,(x)->x+1).limit().forEach()  打印0 1 2 3 ....  产生无数个不同的内容

    返回类型boolean 的 三个

    .allMatch(x->return boolean )是否全部匹配

    .anyMatch()是否至少有一个匹配

    .noneMatch()是否都不匹配

    1. ArrayList list = new ArrayList<>();
    2. Student s1 = new Student("Aee",21,77);
    3. Student s2 = new Student("Andy",25,76);
    4. Student s3 = new Student("Aoker",20,58);
    5. Student s4 = new Student("Andy",25,76);
    6. Collections.addAll(list,s1,s2,s3,s4);
    7. //是不是所有同学以A开头
    8. boolean flag=list.stream()
    9. .allMatch((stu)->{return stu.getName().charAt(0)=='A';});
    10. //是否有未成年
    11. boolean flag_1=list.stream()
    12. .anyMatch((stu)->{return stu.getAge()<18;});
    13. System.out.println("是不是所有同学以A开头"+flag);
    14. System.out.println("是否有未成年"+flag_1);

    返回类型是Optional

    findFirst

    Optional<T> findFirst()

    返回描述此流的第一个元素的Optional如果流为空,则返回一个空的Optional 。 如果流没有遇到顺序,则可能会返回任何元素

     

    1. //得到全班最大的年龄
    2. Integer age=list.stream()
    3. .sorted((n,old)->{return old.getAge()-n.getAge();})
    4. .map((stu)->{return stu.getAge();})//(被转化的类型)->{ 转化以后的类型}
    5. .findFirst()//放 ofNullable
    6. .orElse(0);//取
    7. System.out.println(age);
    8. //打印第一个A开头的
    9. String mingzi=list.stream()
    10. .map((stu)->{return stu.gametName();})//Student--->String 类型了
    11. .filter((name)->{return ne.startsWith("A");})//String-->过滤名字为A开头的
    12. .findFirst()//找到第一个A开头的 如果能找到则就是那个 找不到就为Optional.empty
    13. .orElse("null");//为空则 null 不为空则没事
    14. System.out.println(mingzi);

    .max(比较器) 返回最后一个元素 Optional【升序默认】

    .min(比较器) 返回第一一个元素 Optional【升序默认】

    1. //得到全班最大的年龄 max
    2. Integer age=list.stream()
    3. .map((stu)->{return stu.getAge();})
    4. .max((n,o)->{return n-o;})
    5. .orElse(0);
    6. System.out.println("最大的年龄"+age);
    7. //得到名字最长的学生
    8. Student maxStu=list.stream()
    9. .max((n,o)->{return n.getName().length()-o.getName().length();})
    10. .orElseGet(Student::new);
    11. //.orElse(new Student());
    12. System.out.println("最长的学生"+maxStu);

    .reduce()//合并  求总分 Optional类型

    1. //求全班总分
    2. Integer ss=list.stream()
    3. .map((stu)->{return stu.getScore();})
    4. .reduce((sum,y)->{
    5. System.out.println("sum="+sum+" y="+y);
    6. return sum+y;})
    7. .orElse(0);
    8. System.out.println("总分:"+ss);

    .count() long类型的 统计流中的个数 统计上一步的

    long count()

    返回此流中的元素数

    1. long count()
    2. 返回此流中的元素数
    3. //求全班总分
    4. Integer ss=list.stream()
    5. .map((stu)->{return stu.getScore();})
    6. .reduce((sum,y)->{
    7. System.out.println("sum="+sum+" y="+y);
    8. return sum+y;})
    9. .orElse(0);
    10. System.out.println("总分:"+ss);
    11. //统计低于平均分
    12. int avg=ss/list.size();
    13. long number=list.stream()
    14. .map(Student::getScore)
    15. .filter((score)->{return score
    16. .count();
    17. System.out.println("低于平均分个数:"+number);

    Collect(Collector)收集器

    collect(Collectors.toList())

    1. //将所有及格的学生收集到list中
    2. //collect(Collectors.toList())
    3. List list01=list.stream()
    4. .filter((stu)->{return stu.getScore()>=60;})
    5. .collect(Collectors.toList());
    6. System.out.println(list01);

    collect(Collectors.toSet()) 去重

    1. //将所有不及格的成绩收集到Set【quchong]
    2. //collect(Collectors.toSet())
    3. Set set=list.stream()
    4. .filter((stu)->{return stu.getScore()>=60;})
    5. .map((stu)->{return stu.getScore();})
    6. .collect(Collectors.toSet());
    7. System.out.println(set);

    ToMap  两个参数 值一样会异常 和 三个参数

    1. .collect(Collectors.toMap(()->{}.()->{},()->{}))
    2. Map map=list.stream()
    3. .collect(Collectors.toMap((stu)->{return stu.getName();},
    4. (stu)->{return stu.getScore();},(oldV,newV)->{return newV;}));
    5. System.out.println(map);

    collect 分组的  20-【jakc.okrd】 25-【Aron.andy】

    //Map> map=list.stream().collect(()->{});

    1. Map> map01=list.stream()
    2. .collect(Collectors.groupingBy(Student::getAge));
    3. System.out.println(map01);

    )

    collect.joining()

    //必须前一个是String类型

    String ss=list.stream().map(Student::getName).collect(Collectors.joining(“@”));

    Lee@Andy@Joker  

    这样拼起来 

  • 相关阅读:
    C语言:通讯录联系(内存存储)
    【历史上的今天】7 月 28 日:Lua 首次在线上运行;苹果停产所有非 iOS 的 iPod;戴尔工作站 400 推出
    代码随想录第28天|回溯算法
    【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第三章
    学习笔记——路由网络基础——浮动静态路由(路由备份和冗余)
    从源码看vue(v2.7.10)中的v-model(双向绑定)的原理
    【python自动化】03. pynput库自动操作键鼠(保姆级代码注释)
    嵌入式开发学习之--点亮LED灯(下)
    Java API 类导入
    面向面试知识-Redis
  • 原文地址:https://blog.csdn.net/Miserables_/article/details/143339419