• java8 新特性4 Stream Api-1


    一 Stream

    1.1 stream的概述

    stream 是java8的新特性,用于操作java中list,set,map等存储结合中的元素。

    1.stream 自己不会存储元素

    2.stream不会改变源对象,相反,他们会返回一个持有结果的新stream。

    3.stream操作是延迟执行的,也就是说等到有结果的时候才执行。

    1.2 stream的操作

    1 首先创建stream:从一个数据源中,如集合或者数组中,获取一个流。

    2.中间操作:中间采用过滤,分组等操作对数据进行操作。

    3.结束操作:将执行的结果产生结果。

    1.3 常用api

    //1.map 映射,将流中的每一个元素 T 映射为 R(类似类型转换

    二  stream的操作

    说明:以下演示操作,需要一些数据的支持,本案例自己模拟了一部分数据,见下:

    1. public class StudentDb {
    2. public static List stuList=new ArrayList<>();
    3. static{
    4. stuList.add(new Student("beijing",23,90.34,"2021-10-04"));
    5. stuList.add(new Student("tianjin",34,30.34,"2021-09-04"));
    6. stuList.add(new Student("shanghai",56,45.24,"2022-10-04"));
    7. stuList.add(new Student("tianjin",89,70.89,"2021-06-03"));
    8. stuList.add(new Student("shenzhen",95,95.89,"2022-10-03"));
    9. stuList.add(new Student(45,89.89,"2022-07-03"));
    10. }
    11. }

    2.1 创建stream

    1. public static void createStream(){
    2. //1.通过list转成stream
    3. List<String> dataList=new ArrayList<>();
    4. Stream<String> s=dataList.stream();
    5. System.out.println("s:"+s);
    6. //2.通过数组
    7. List<String> strList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee");
    8. Stream<String> stream = strList.stream();
    9. System.out.println("str:"+stream.count());
    10. //3.stream类中的静态方法
    11. Stream<List<String>> stream2= Stream.of(dataList);
    12. System.out.println("ss:"+stream2);
    13. //4.创建无限流
    14. Stream<Integer> stream3= Stream.iterate(0,(x)->{return x+2;});
    15. System.out.println("ss:"+stream3.limit(3));
    16. }

    2.2 遍历list

    1. /**
    2. * @author liujianfu
    3. * @description 遍历
    4. * @date 2022/11/1 11:12
    5. * @param []
    6. * @return void
    7. */
    8. public static void bianli(){
    9. List<Student> stuList= StudentDb.stuList;
    10. //遍历1
    11. stuList.stream().collect(Collectors.toList()).forEach((x)->{System.out.println(x);});
    12. //遍历2
    13. stuList.forEach(System.out::println);
    14. Map<String,Integer> rMap=new HashMap<String,Integer>();
    15. rMap.put("bj",1);
    16. rMap.put("sh",3);
    17. rMap.forEach((k,v)->{System.out.println("k:"+k+" v:"+v);});
    18. }

    案例2: 遍历list    :   

    dataList.forEach((x)->{System.out.println("x:"+x);});
    1. public class Test {
    2. public static void main(String[] args) {
    3. List<String> dataList=new ArrayList<String>();
    4. dataList.add("beijing");
    5. dataList.add("shanghai");
    6. dataList.add("zhengzhou");
    7. dataList.forEach((x)->{System.out.println("x:"+x);});
    8. }
    9. }

     2.3 封装数据

    2.4  切片和过滤

    1. /**
    2. * @author liujianfu
    3. * @description 切边和过滤
    4. * @date 2022/10/31 17:56
    5. * @param []
    6. * @return void
    7. */
    8. public static void operateQiePianAndFilter(){
    9. //1.filter 过滤掉信息,
    10. List<Student> stuList= StudentDb.stuList;
    11. //过滤掉姓名为shenzhen的数据
    12. stuList.stream().filter((e)->{return !"shenzhen".equals(e.getName());}).forEach((x)->{System.out.println("x:"+x);});
    13. System.out.println("========");
    14. //2.limit 截断流
    15. stuList.stream().filter((e)->{return !"shenzhen".equals(e.getName());}).limit(2).forEach((x)->{System.out.println("x:"+x);});
    16. System.out.println("=========");
    17. //3.skip 跳过n个元素
    18. stuList.stream().filter((e)->{return !"shenzhen".equals(e.getName());}).skip(3).forEach((x)->{System.out.println("x:"+x);});
    19. System.out.println("=====");
    20. //4.distinct,通过每个元素的去重字段进行重写的hashcode和equals进行去重,这里将name字段进行equals和hashcode进行重写
    21. stuList.stream().distinct().forEach((x)->{System.out.println("x:"+x);});
    22. }

    2.5 映射

    1. /**
    2. * @author liujianfu
    3. * @description 数据映射
    4. * @date 2022/10/31 19:02
    5. * @param []
    6. * @return void
    7. */
    8. public static void operateDataMapping(){
    9. //1.map 映射,将流中的每一个元素 T 映射为 R(类似类型转换)
    10. List<Student> stuList= StudentDb.stuList;
    11. stuList.stream().map((x)->{return x.getName();}).forEach(System.out::println);
    12. System.out.println("=====");
    13. //2. flatmap,将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流
    14. List<String> list = new ArrayList<>();
    15. list.add("aaa bbb ccc");
    16. list.add("ddd eee fff");
    17. list.add("ggg hhh iii");
    18. list = list.stream().map(s -> s.split(" ")).
    19. flatMap(Arrays::stream).collect(Collectors.toList());
    20. list.stream().forEach(System.out::println);
    21. }

    2.6 排序

    1. /**
    2. * @author liujianfu
    3. * @description 排序
    4. * @date 2022/11/1 10:18
    5. * @param []
    6. * @return void
    7. */
    8. public static void sortData(){
    9. List<Student> stuList= StudentDb.stuList;
    10. //默认排序
    11. stuList.stream().map((s)->{return s.getName()==null?"www":s.getName();})
    12. .sorted()
    13. .forEach(System.out::println);
    14. //先按年龄排序,年龄相等,按姓名
    15. stuList.stream()
    16. .sorted((x, y) -> {
    17. if(x.getAge() == y.getAge()){
    18. return x.getName().compareTo(y.getName());
    19. }else{
    20. return Integer.compare(x.getAge(), y.getAge());
    21. }
    22. }).forEach(System.out::println);
    23. }

    2.7 查找和匹配

    1. /**
    2. * @author liujianfu
    3. * @description 匹配
    4. * @date 2022/11/1 10:20
    5. * @param []
    6. * @return void
    7. */
    8. public static void chazhaoAndPiPei(){
    9. List<Student> stuList= StudentDb.stuList;
    10. //是否匹配
    11. boolean f1=stuList.stream().allMatch((e)->{return e.getName().equals("tianjing");});
    12. System.out.println("f1:"+f1);
    13. boolean f2=stuList.stream().anyMatch((e)->{return "tianjin".equals(e.getName());});
    14. System.out.println("f1:"+f2);
    15. //检查是否没有匹配的元素
    16. boolean f3=stuList.stream().noneMatch((e)->{return"tianjing".equals(e.getName());});
    17. System.out.println("f1:"+f3);
    18. System.out.println("====================");
    19. //获取第一个元素
    20. Optional<Student> op = stuList.stream()
    21. .sorted((e1, e2) -> Double.compare(e1.getScore(), e2.getScore()))
    22. .findFirst();
    23. System.out.println(op.get());
    24. //获取个数,最大值,最小值
    25. long s= stuList.stream().map((x)->{return x.getScore();}).count();
    26. Optional<Double> op2 =stuList.stream().map((x)->{return x.getScore();}).max( (x,y)->{return Double.compare(x,y);});
    27. Optional<Double> op3= stuList.stream().map(Student::getScore).max(Double::compare);
    28. Optional<Student> op4 =stuList.stream().min((x,y)->{ return Double.compare(x.getScore(),y.getScore());});
    29. System.out.println("geshu:"+s+" 最大值:"+op2.get()+" 最大值:"+op3.get()+" 最小值:"+op4.get());
    30. }

    2.8 聚合函数(count,sum,max,min,avg)

    1. /**
    2. * @author liujianfu
    3. * @description 求5大聚合函数
    4. * @date 2022/11/1 15:42
    5. * @param []
    6. * @return void
    7. */
    8. public static void getFiveFunction(){
    9. List<Student> stuList= StudentDb.stuList;
    10. System.out.println("方式1:................");
    11. long s= stuList.stream().map((x)->{return x.getScore();}).count();
    12. Optional<Double> op2 =stuList.stream().map((x)->{return x.getScore();}).max( (x,y)->{return Double.compare(x,y);});
    13. Optional<Double> op3= stuList.stream().map(Student::getScore).max(Double::compare);
    14. Optional<Student> op4 =stuList.stream().min((x,y)->{ return Double.compare(x.getScore(),y.getScore());});
    15. System.out.println("geshu:"+s+" 最大值:"+op2.get()+" 最大值:"+op3.get()+" 最小值:"+op4.get());
    16. System.out.println("方式2:................");
    17. Optional<Double> max = stuList.stream().map(Student::getScore).collect(Collectors.maxBy(Double::compare));
    18. Optional<Double> op = stuList.stream().map(Student::getScore).collect(Collectors.minBy((x,y)->{ return Double.compare(x,y);}));
    19. Optional<Student> st = stuList.stream().collect(Collectors.minBy((e1, e2) -> Double.compare(e1.getScore(), e2.getScore())));
    20. Double sum = stuList.stream().collect(Collectors.summingDouble(Student::getScore));
    21. Double avg =stuList.stream().collect(Collectors.averagingDouble(Student::getScore));
    22. Long count = stuList.stream().collect(Collectors.counting());
    23. System.out.println("条数:"+count+" 最大值:"+max+" 最小值:"+op+" 和:"+sum+" 平均值:"+avg+"st:"+st);
    24. System.out.println("--------------------------------------------");
    25. }

    2.9  分组

    1. /**
    2. * @author liujianfu
    3. * @description 分组
    4. * @date 2022/11/1 15:44
    5. * @param []
    6. * @return void
    7. */
    8. public static void groupbyZiduan(){
    9. List<Student> stuList= StudentDb.stuList;
    10. Map<String, List<Student>> map = stuList.stream().filter((e)->{return e.getName()!=null;})
    11. .collect(Collectors.groupingBy(Student::getName));
    12. map.forEach((k,v)->{System.out.println("k:"+k+" v:"+v);});
    13. Map<Double, Map<String, List<Student>>> map2 = stuList.stream().collect(Collectors.groupingBy(Student::getScore, Collectors.groupingBy((e) -> {
    14. if(e.getAge() >= 60)
    15. return "老年";
    16. else if(e.getAge() >= 35)
    17. return "中年";
    18. else
    19. return "成年";
    20. })));
    21. System.out.println("map2:"+map2);
    22. }

    截图:

     2.10  分区

    1. /**
    2. * @author liujianfu
    3. * @description 分区
    4. * @date 2022/11/1 16:03
    5. * @param []
    6. * @return void
    7. */
    8. public static void fenqu(){
    9. List<Student> stuList= StudentDb.stuList;
    10. Map<Boolean, List<Student>> stMap= stuList.stream().collect(Collectors.partitioningBy((e) -> e.getScore() >= 60));
    11. System.out.println("st:"+stMap);
    12. }

    截图如下:分为两部分,满足和不满足 

     2.11  拼接字符串

    1. /**
    2. * @author liujianfu
    3. * @description 拼接字符串
    4. * @date 2022/11/1 16:27
    5. * @param []
    6. * @return void
    7. */
    8. public static void joinZifuchuan(){
    9. List<Student> stuList= StudentDb.stuList;
    10. String str = stuList.stream().map(Student::getName).collect(Collectors.joining("," , "----", "----"));
    11. System.out.println(str);
    12. }

  • 相关阅读:
    开发《星球大战》小游戏的意义
    使用cannon.js创建3D物理仿真场景
    开放式耳机选择什么品牌?六款口碑好爆的开放式耳机盘点
    Linux修改远程登陆端口
    Windows OpenGL ES 图像灰度图
    offline RL | CQL:魔改 Bellman error 更新,得到 Q 函数 lower-bound
    R语言绘制染色体变异位置分布图,RIdeogram包
    深度学习入门(九) 多层感知机实现
    李宏毅老师《机器学习》课程笔记-4.1 Self-attention
    如何在h5和小程序中适配iphoneX及更高版本全面屏底部的安全区
  • 原文地址:https://blog.csdn.net/u011066470/article/details/127603018