Stream流

打印 上一主题 下一主题

主题 795|帖子 795|积分 2385

1.体验Stream流

   

  • 案例需求
    按照下面的要求完成集合的创建和遍历

    • 创建一个集合,存储多个字符串元素
    • 把集合中所有以"张"开头的元素存储到一个新的集合
    • 把"张"开头的集合中的长度为3的元素存储到一个新的集合
    • 遍历上一步得到的集合

  • 原始方式示例代码
  1. package Stream;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. public class demo1 {
  6.     public static void main(String[] args) {
  7. /*
  8. 案例需求
  9. 按照下面的要求完成集合的创建和遍历
  10. - 创建一个集合,存储多个字符串元素
  11. - 把集合中所有以"张"开头的元素存储到一个新的集合
  12. - 把"张"开头的集合中的长度为3的元素存储到一个新的集合
  13. - 遍历上一步得到的集合
  14. */
  15.         //集合的批量添加
  16.         ArrayList<String> list1 = new ArrayList<>();
  17.         Collections.addAll(list1, "张三丰", "张无忌", "张翠山", "王二麻子", "张良", "谢广坤");
  18.         ArrayList<String> list2 = new ArrayList<>();
  19.         //- 把集合中所有以"张"开头的元素存储到一个新的集合
  20.         //遍历list1把以张开头的元素添加到list2中。
  21.         for (String name : list1) {
  22.             if (name.startsWith("张")) {
  23.                 list2.add(name);
  24.             }
  25.         }
  26.         System.out.println(list2);
  27.         //- 把"张"开头的集合中的长度为3的元素存储到一个新的集合
  28.         ArrayList<String> list3 = new ArrayList<>();
  29.         for (String name : list2) {
  30.             if(name.length()==3){
  31.                 list3.add(name);
  32.             }
  33.         }
  34.         System.out.println(list3);
  35.     }
  36. }
复制代码
利用Stream流示例代码

  1. public class demo2 {
  2.     public static void main(String[] args) {
  3.         //使用Stream流示例代码
  4.         //集合的批量添加
  5.         ArrayList<String> list1 = new ArrayList<>(List.of("张三丰","张无忌","张翠山","王二麻子","张良","谢广坤"));
  6.         list1.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(name-> System.out.println(name));
  7.     }
  8. }
复制代码
2.Stream流的常见生成方式

Stream流的头脑



   

  • Stream流的三类方法

    • 获取Stream流

      • 创建一条流水线,并把数据放到流水线上预备进行操作

    • 中间方法

      • 流水线上的操作
      • 一次操作完毕之后,还可以继续进行其他操作

    • 终结方法

      • 一个Stream流只能有一个终结方法
      • 是流水线上的最后一个操作


  
   

  • 生成Stream流的方式

    • Collection体系集合
      利用默认方法stream()生成流, default Stream<E> stream()
    • Map体系集合
      把Map转成Set集合,间接的生成流
    • 数组
      通过Arrays中的静态方法stream生成流
    • 同种数据范例的多个数据
      通过Stream接口的静态方法of(T... values)生成流

  

  1. package Stream;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.HashMap;
  6. import java.util.stream.Stream;
  7. public class demo3 {
  8.     public static void main(String[] args) {
  9.         /*
  10.         单列集合      default Stream<E> stream()                           Collection中的默认方法
  11.         双列集合      无                                                   无法直接使用stream流
  12.         数组          public static <T> Stream<T> stream(T[] array)        Arrays工具类中的静态方法
  13.         一堆零散数据   public static<T> Stream<T> of(T... values)           Stream接口中的静态方法
  14. */
  15.         //使用单列集合创建stream流
  16.         ArrayList<String> list = new ArrayList<>();
  17.         Collections.addAll(list,"aaa","bbb","ccc");
  18.         list.stream().forEach(s->System.out.println(s));
  19.         System.out.println("----------------------");
  20.         //使用双列集合创建stream流
  21.         HashMap<String,Integer> hm = new HashMap<>();
  22.         hm.put("aaa",1);
  23.         hm.put("bbb",2);
  24.         hm.put("ccc",3);
  25.         //第一种获取stream流
  26.         //先获取一个键值对对象,把键值对对象放到了stream流,这里的s相当于每一个键值对对象
  27.         hm.entrySet().stream().forEach(s-> System.out.println(s));
  28.         //第二种获取stream流
  29.         //先获取所有的键,把键放在stream流,这里的s相当于每一个键
  30.         hm.keySet().stream().forEach(s-> System.out.println(s));
  31.         System.out.println("----------------------");
  32.         //使用数组创建stream流
  33.         int []arr1 = {1,2,3,4,5};
  34.         Arrays.stream(arr1).forEach(s-> System.out.print(s+" "));
  35.         System.out.println();
  36.         String[] arr2 = {"aaa","bbb","ccc"};
  37.         Arrays.stream(arr2).forEach(s-> System.out.print(s+" "));
  38.         System.out.println();
  39.         //注意:
  40.         //Stream接口中静态方法of的细节
  41.         //方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
  42.         //但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元素,放到Stream当中。
  43.         Stream.of(arr1).forEach(s-> System.out.println(s+" "));//[I@30dae81
  44.         Stream.of(arr2).forEach(s-> System.out.println(s+" "));
  45.         System.out.println("----------------------");
  46.         //使用一堆零散数据创建stream流
  47.         Stream.of(1,2,3,4,5).forEach(s-> System.out.print(s+" "));
  48.         Stream.of("a","b","c","d","e").forEach(s-> System.out.print(s+" "));
  49.     }
  50. }
复制代码


3.Stream流中间操作方法



  • 概念
    中间操作的意思是,实行完此方法之后,Stream流依然可以继续实行其他操作



  1. package Stream;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.SortedMap;
  5. /*
  6.           filter              过滤
  7.           limit               获取前几个元素
  8.           skip                跳过前几个元素
  9.           注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
  10.           注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
  11.       */
  12. public class demo4 {
  13.     public static void main(String[] args) {
  14.         //1.  filter 过滤
  15.         ArrayList<String> list = new ArrayList<>();
  16.         Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
  17.         //filter   过滤  把张开头的留下,其余数据过滤不要
  18.         list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));
  19.         //注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
  20.         //list的集合还是不会变化
  21.         System.out.println(list);
  22.         System.out.println("====================================");
  23.         //2 . limit  获取前几个元素
  24.         list.stream().limit(3).forEach(s -> System.out.println(s));//张无忌", "周芷若", "赵敏
  25.         System.out.println("====================================");
  26.         //3. skip  跳过前几个元素
  27.         list.stream().skip(3).limit(3).forEach(s -> System.out.println(s));//张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤
  28.     }
  29. }
复制代码
  1. package Stream;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.stream.Stream;
  5. /*
  6.          distinct            元素去重,依赖(hashCode和equals方法)
  7.          concat              合并a和b两个流为一个流
  8.          注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
  9.          注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
  10.      */
  11. public class demo5 {
  12.     public static void main(String[] args) {
  13.         ArrayList<String> list1 = new ArrayList<>();
  14.         Collections.addAll(list1, "张无忌","张无忌","张无忌", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
  15.        //1. distinct     元素去重,依赖(hashCode和equals方法)
  16.         list1.stream().distinct().forEach(s->System.out.println(s));
  17.         System.out.println("-------------------------------------");
  18.         //2.    concat              合并a和b两个流为一个流
  19.         //创建一个新的集合
  20.         ArrayList<String> list2 = new ArrayList<>();
  21.         Collections.addAll(list2,"周芷若", "赵敏");
  22.         Stream.concat(list1.stream(), list2.stream()).distinct().forEach(s->System.out.println(s));
  23.     }
  24. }
复制代码
  1. package Stream;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.function.Function;
  5. public class demp6 {
  6.     public static void main(String[] args) {
  7.             /*
  8.             map                 转换流中的数据类型
  9.             注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
  10.             注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
  11.         */
  12.         ArrayList<String> list = new ArrayList<>();
  13.         Collections.addAll(list, "张无忌-15", "周芷若-14", "赵敏-13", "张强-20", "张三丰-100", "张翠山-40", "张良-35", "王二麻子-37", "谢广坤-41");
  14.         //需求:只获取里面的年龄并进行打印
  15.         //String->int
  16.         //第一个类型:流中原本的数据类型
  17.         //第二个类型:要转成之后的类型
  18.         //apply的形参s:依次表示流里面的每一个数据
  19.         //返回值:表示转换之后的数据
  20.         //当map方法执行完毕之后,流上的数据就变成了整数
  21.         //所以在下面forEach当中,s依次表示流里面的每一个数据,这个数据现在就是整数了
  22.        /* list.stream().map(new Function<String, Integer>() {
  23.             @Override
  24.             public Integer apply(String s) {
  25.                 String[] arr = s.split("-");//张无忌-15
  26.                 String ageString = arr[1];//15
  27.                 int age = Integer.parseInt(ageString);
  28.                 return age;
  29.             }
  30.         }).forEach(s-> System.out.println(s));*/
  31.         list.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s-> System.out.println(s));
  32.     }
  33. }
复制代码
4.Stream流终结操作方法



  • 概念
    终结操作的意思是,实行完此方法之后,Stream流将不能再实行其他操作
  • 常见方法




  1. package Stream;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.function.IntFunction;
  6. public class demo7 {
  7.     public static void main(String[] args) {
  8.         /*
  9.             void forEach(Consumer action)           遍历
  10.             long count()                            统计
  11.             toArray()                               收集流中的数据,放到数组中
  12.        */
  13.         ArrayList<String> list = new ArrayList<>();
  14.         Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");
  15.         //void forEach(Consumer action)           遍历
  16.         //Consumer的泛型:表示流中数据的类型
  17.         //accept方法的形参s:依次表示流里面的每一个数据
  18.         //方法体:对每一个数据的处理操作(打印)
  19.         list.stream().forEach(s -> System.out.println(s));
  20.         System.out.println("------------------------");
  21.         //2.   long count()                            统计
  22.         System.out.println(list.stream().count());
  23.         System.out.println("-----------------------");
  24.         //3. toArray()                               收集流中的数据,放到数组中
  25.         //Object[] arr1 = list.stream().toArray();
  26.         //System.out.println(Arrays.toString(arr1));
  27.         //IntFunction的泛型:具体类型的数组
  28.         //apply的形参:流中数据的个数,要跟数组的长度保持一致
  29.         //apply的返回值:具体类型的数组
  30.         //方法体:就是创建数组
  31.         //toArray方法的参数的作用:负责创建一个指定类型的数组
  32.         //toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组当中
  33.         //toArray方法的返回值:是一个装着流里面所有数据的数组
  34.       /*  String[] arr = list.stream().toArray(new IntFunction<String[]>() {
  35.             @Override
  36.             public String[] apply(int value) {
  37.                 return new String[value];
  38.             }
  39.         });
  40.         System.out.println(Arrays.toString(arr));*/
  41.         System.out.println(Arrays.toString( list.stream().toArray(value -> new String[value])));
  42.     }
  43. }
复制代码

  1. package Stream;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.function.Function;
  7. import java.util.stream.Collectors;
  8. public class demo8 {
  9.     public static void main(String[] args) {
  10.        /* collect(Collector collector)            收集流中的数据,放到集合中 (List Set Map)
  11.         注意点:
  12.         如果我们要收集到Map集合当中,键不能重复,否则会报错
  13.                 */
  14.         ArrayList<String> list = new ArrayList<>();
  15.         Collections.addAll(list, "张无忌-男-15", "周芷若-女-14", "赵敏-女-13", "张强-男-20",
  16.                 "张三丰-男-100", "张翠山-男-40", "张良-男-35", "王二麻子-男-37", "谢广坤-男-41");
  17.         //收集List集合当中
  18.         //需求:
  19.         //我要把所有的男性收集起来
  20.         list.stream()
  21.                 .filter(s -> "男".equals(s.split("-")[1]))
  22.                 .collect(Collectors.toList())
  23.                 .forEach(s -> System.out.println(s));
  24.         System.out.println("----------------------");
  25.         //收集Set集合当中
  26.         //需求:
  27.         //我要把所有的男性收集起来
  28.         //set集合与list区别就在于set能去重
  29.         list.stream()
  30.                 .filter(s -> "男".equals(s.split("-")[1]))
  31.                 .collect(Collectors.toSet())
  32.                 .forEach(s -> System.out.println(s));
  33.         System.out.println("--------------------------------");
  34.         //收集Map集合当中
  35.         //谁作为键,谁作为值.
  36.         //我要把所有的男性收集起来
  37.         //键:姓名。 值:年龄
  38.         /*
  39.         toMap:参数一:表示键的生成规则
  40.               参数二:表示值的生成规则
  41.          参数一:
  42.                 Function泛型一:表示流中的每一个数据的类型
  43.                         泛型二:表示Map集合中键的数据类型
  44.                 方法apply形参:依次表示流里的每一个数据
  45.                          方法体: 生成键的代码
  46.                          返回值:已经生成的键
  47.          参数二:
  48.                 Function泛型一:表示流中的每一个数据的类型
  49.                         泛型二:表示Map集合中值的数据类型
  50.                 方法apply形参:依次表示流里的每一个数据
  51.                          方法体: 生成值的代码
  52.                          返回值:已经生成的值
  53.          */
  54.         Map<String, Integer> newmap = list.stream()
  55.                 .filter(s -> "男".equals(s.split("-")[1]))
  56.                 .collect(Collectors.toMap(new Function<String, String>() {
  57.                     @Override
  58.                     public String apply(String s) {
  59.                         //张无忌-男-15
  60.                         return s.split("-")[0];
  61.                     }
  62.                 }, new Function<String, Integer>() {
  63.                     @Override
  64.                     public Integer apply(String s) {
  65.                         return Integer.parseInt(s.split("-")[2]);
  66.                     }
  67.                 }));
  68.         System.out.println(newmap);
  69.         System.out.println("---------------------");
  70.         Map<String, Integer> map = list.stream()
  71.                 .filter(s -> "男".equals(s.split("-")[1]))
  72.                 .collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[2])));
  73.         System.out.println(map);
  74.     }
  75. }
复制代码





5.练习




  1. public class demo1 {
  2.     public static void main(String[] args) {
  3.         ArrayList<Integer> list = new ArrayList<>();
  4.         Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9,10);
  5.         list.stream()
  6.                 .filter(x -> x % 2 == 0)
  7.                 .collect(Collectors.toList())
  8.                 .forEach(s->System.out.println(s));
  9.     }
  10. }
复制代码




  1. package lx;
  2. import java.util.ArrayList;
  3. import java.util.Map;
  4. import java.util.function.Function;
  5. import java.util.stream.Collectors;
  6. public class demo2 {
  7.     public static void main(String[] args) {
  8.         ArrayList<Student> list = new ArrayList<>();
  9.         Student s1 = new Student("zhangsan", 23);
  10.         Student s2 = new Student("lisi", 24);
  11.         Student s3 = new Student("wangwu", 25);
  12.         list.add(s1);
  13.         list.add(s2);
  14.         list.add(s3);
  15.         Map<String, Integer> newmap =
  16.                 list.stream()
  17.                 .filter(student -> student.getAge() >=24)
  18.                 .collect(Collectors.toMap(new Function<Student, String>() {
  19.                     @Override
  20.                     public String apply(Student student) {
  21.                         return student.getName();
  22.                     }
  23.                 }, new Function<Student, Integer>() {
  24.                     @Override
  25.                     public Integer apply(Student student) {
  26.                         return student.getAge();
  27.                     }
  28.                 }));
  29.         System.out.println(newmap);
  30.         System.out.println("-----------------");
  31.         //lambda表达式
  32.         Map<String, Integer> newmap2 = list.stream()
  33.                 .filter(student -> student.getAge() > 24)
  34.                 .collect(Collectors.toMap(student -> student.getName(), student -> student.getAge()));
  35.         System.out.println(newmap2);
  36.     }
复制代码






  1. package lx;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.function.Function;
  6. import java.util.stream.Collectors;
  7. import java.util.stream.Stream;
  8. public class demo3 {
  9.     public static void main(String[] args) {
  10.        /*
  11.         现在有两个ArrayList集合,分别存储6名男演员的名字和年龄以及6名女演员的名字和年龄。
  12.         姓名和年龄中间用逗号隔开。
  13.         比如:张三,23
  14.         要求完成如下的操作:
  15.         1,男演员只要名字为3个字的前两人
  16.         2,女演员只要姓杨的,并且不要第一个
  17.         3,把过滤后的男演员姓名和女演员姓名合并到一起
  18.         4,将上一步的演员信息封装成Actor对象。
  19.         5,将所有的演员对象都保存到List集合中。
  20.         备注:演员类Actor,属性有:name,age
  21.         男演员:  "蔡坤坤,24" , "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27"
  22.         女演员:  "赵小颖,35" , "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33"
  23.       */
  24.         //1.创建两个ArrayList集合
  25.         ArrayList<String> manList = new ArrayList<>();
  26.         ArrayList<String> womenList = new ArrayList<>();
  27.         //2.添加数据
  28.         Collections.addAll(manList, "蔡坤坤,24", "叶齁咸,23", "刘不甜,22", "吴签,24", "谷嘉,30", "肖梁梁,27");
  29.         Collections.addAll(womenList, "赵小颖,35", "杨颖,36", "高元元,43", "张天天,31", "刘诗,35", "杨小幂,33");
  30.         //3.男演员只要名字为3个字的前两人
  31.         Stream<String> stream1 = manList.stream()
  32.                 .filter(s -> s.split(",")[0].length() == 3)
  33.                 .limit(2);
  34.         //4.女演员只要姓杨的,并且不要第一个
  35.         Stream<String> stream2 = womenList.stream()
  36.                 .filter(s -> s.split(",")[0].startsWith("杨"))
  37.                 .skip(1);
  38.         //5,把过滤后的男演员姓名和女演员姓名合并到一起
  39.         //Stream.concat(stream1,stream2);
  40.         //6.将上一步的演员信息封装成Actor对象。
  41.         //String -> Actor对象 (类型转换)
  42.         //第一个类型:流中原本的数据类型
  43.         //第二个类型:要转成之后的类型
  44.         //apply的形参s:依次表示流里面的每一个数据
  45.         //返回值:表示转换之后的数据
  46.         //当map方法执行完毕之后,流上的数据就变成了Actor
  47.         //所以在下面forEach当中,s依次表示流里面的每一个数据,这个数据现在就是Actor类型的数据了
  48.        /* Stream.concat(stream1, stream2).map(new Function<String, Actor>() {
  49.             @Override
  50.             public Actor apply(String s) {
  51.                 //赵小颖,35
  52.                 String[] arr = s.split(",");
  53.                 String name = arr[0];//赵小颖
  54.                 int age = Integer.parseInt(arr[1]);
  55.                 return new Actor(name, age);
  56.             }
  57.         });*/
  58.         //7,将所有的演员对象都保存到List集合中。
  59.         List<Actor> newlist = Stream.concat(stream1, stream2)
  60.                 .map(s -> new Actor(s.split(",")[0],
  61.                         Integer.parseInt(s.split(",")[1])))
  62.                 .collect(Collectors.toList());
  63.         System.out.println(newlist);
  64.     }
  65. }
复制代码

​​​​​​​


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

温锦文欧普厨电及净水器总代理

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表