Stream流

发布时间 2023-03-23 09:23:02作者: 戒爱学Java

Stream流

Stream流的作用:

结合了Lambda表达式,简化集合、数组的操作

Stream流的使用步骤以及方法详解:

  1. 先得到一条Stream流(流水线),并把数据放上去。

/*
	单列集合
*/
		ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"a","b","c","d","e");

        Stream<String> stream1 = list.stream();
        stream1.forEach(s -> System.out.println(s));

/*
	双列集合
*/
		HashMap<String,Integer> hm = new HashMap<>();

        hm.put("aaa",1);
        hm.put("bbb",2);
        hm.put("ccc",3);
        hm.put("ddd",4);
        hm.put("eee",5);

        hm.keySet().stream().forEach(s -> System.out.println(s));

        hm.entrySet().stream().forEach(s -> System.out.println(s));

/*
     数组
*/
        int[] arr = {1,2,3,4,5};

        Arrays.stream(arr).forEach(s-> System.out.println(s));

/*
     散列数据,但是数据类型相同
*/
        Stream.of(1,2,3,4,5).forEach(s-> System.out.println(s));
  1. 利用Stream流中的API进行各种操作

    • 中间方法(过滤、转换):方法调用完毕之后还可以调用其他方法

      注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
      注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据

      /**
       * @author 戒爱学Java
       * @date 2023/3/22 19:39
       */
      public class StreamDemo6 {
          public static void main(String[] args) {
              ArrayList<String> list = new ArrayList<>();
              Collections.addAll(list,"张无忌-10","赵敏-15","周芷若-20","张强-35","张三丰-60","张翠山-11","张良-22","王麻子-33","谢广坤-44",
                      "赵四-25","赵敏-18");
      
              ArrayList<String> list2 = new ArrayList<>();
              Collections.addAll(list2,"小明","小子");
              //过滤出来姓张的并且将这些名字打印输出
              list.stream().filter(name -> name.startsWith("张")).forEach(name -> System.out.println(name));
      
              System.out.println("------------------------------");
              //获取前几个元素
              list.stream().limit(3).forEach(name -> System.out.println(name));
      
              System.out.println("------------------------------");
      
              //跳过前几个元素。
              list.stream().skip(3).forEach(name -> System.out.println(name));
      
              System.out.println("------------------------------");
      
              //元素去重
              list.stream().distinct().forEach(name -> System.out.println(name));
      
              System.out.println("==================");
      
              //流的合并
              Stream.concat(list.stream(),list2.stream()).forEach(s -> System.out.println(s));
      
              System.out.println("--------------------------------");
      
              //流里面进行数据转换
              list.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(age -> System.out.println(age));
      
          }
      }
      
    • 终结方法(统计、打印):最后一步,调用完毕之后,不能调用其他方法

    /**
     * @author 戒爱学Java
     * @date 2023/3/22 20:08
     */
    public class StreamDemo7 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            Collections.addAll(list,"张无忌","赵敏","周芷若","张强","张三丰","张翠山","张良","王麻子","谢广坤",
                    "赵四","赵敏");
    
            //遍历
            list.stream().forEach(name -> System.out.println(name));
    
            System.out.println("-------------------------");
    
            //统计
            long count = list.stream().count();
            System.out.println(count);
    
            System.out.println("-------------------------");
    
            //收集流中的数据,并放到数组当中
            String[] array = list.stream().toArray(value -> new String[value]);
            System.out.println(Arrays.toString(array));
        }
    }
    

收集方法collect详解

collect(Collector collector) 收集流中的数据,放到集合当中(List、Set、Map)

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author 戒爱学Java
 * @date 2023/3/23 8:23
 */
public class StreamDemo8 {
    public static void main(String[] args) {

        /**
         * collector(Collector collector)
         *
         * 注意点:
         *      如果我们要把数据收集到Map集合当中,那么键是不能重复的,否则代码会报错
         */
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"张无忌-男-10","赵敏-女-15","周芷若-女-20","张强-男-35","张三丰-男-60",
                "张翠山-男-11","张良-男-22","王麻子-男-33","谢广坤-男-44");

        /**
         * 收集到List集合当中
         * 需求:
         * 把所有男性收集起来
         */

        List<String> newList = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());
        System.out.println(newList);

        Set<String> newSet = list.stream().filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toSet());
        System.out.println(newSet);

        /**
         * toMap
         * 键:姓名
         * 值:年龄
         *
         * toMap :
         *  参数一:
         *      Function泛型一:表示流中每一个数据的类型
         *              泛型二:表示Map集合中键的数据类型
         *              方法apply形参:依次表示流中的每一个数据
         *                    方法体:生成键的代码
         *                    返回值:已经生成的键
         *  参数二:
         *          *      Function泛型一:表示流中每一个数据的类型
         *          *              泛型二:表示Map集合中键的数据类型
         *          *              方法apply形参:依次表示流中的每一个数据
         *          *                    方法体:生成值的代码
         *          *                    返回值:已经生成的值
         */
        Map<String, Integer> newMap = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toMap(
                new Function<String, String>() {
                    @Override
                    public String apply(String s) {
                        return s.split("-")[0];
                    }
                }, new Function<String, Integer>() {
                    @Override
                    public Integer apply(String s) {
                        return Integer.parseInt(s.split("-")[2]);
                    }
                }));

        //Lambda表达式
        Map<String, Integer> newMap2 = list.stream().filter(s -> "男".equals(s.split("-")[1]))
                .collect(Collectors.toMap(s -> s.split("-")[0], s -> Integer.parseInt(s.split("-")[2])));
        System.out.println(newMap);
        System.out.println(newMap2);
    }
}