JDK8新特性之stream流的详细用法

 2022-08-06
原文作者: 西红柿肥皂水 原文地址:https://juejin.cn/post/7000297841847435301

一·什么是stream

Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream主要用于取代部分Collection的操作, 每个流代表一个值序列,流提供一系列常用的聚集操作 ,可以便捷的在它上面进行各种运算。

二·stream的特点

①只能遍历一次:

数据流的从一头获取数据源,在流水线上依次对元素进行操作,当元素通过流水线,便无法再对其进行操作,可以重新在数据源获取一个新的数据流进行操作;

②采用内部迭代的方式:

对Collection进行处理,一般会使用 Iterator 遍历器的遍历方式,这是一种外部迭代;

而对于处理Stream,只要申明处理方式,处理过程由流对象自行完成,这是一种内部迭代,对于大量数据的迭代处理中,内部迭代比外部迭代要更加高效;

三·详细用法

1) 计算元素总数count

    ArrayList<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    long count = list.stream().count(); //返回是一个long类型
    System.out.println(count); //count=3
    复制代码

2) 去重 distinct

    //去除列表中的重复元素
    List<String> list = Arrays.asList("a", "b", "b", "c");
    List<String> distinct = list.stream()
            .distinct()
            .collect(Collectors.toList());
    System.out.println(distinct); //[a, b, c]
    复制代码

3) 筛选filter

    //筛选出列表中的非空项
    List<String> list = Arrays.asList("a", "b", "", "c");
    List<String> filter = list.stream()
            .filter(s -> !s.isEmpty())
            .collect(Collectors.toList());
    System.out.println(filter);//[a, b, c]
    复制代码

4) 截取 limit

    //获取list的前3个值
            List<String> list = Arrays.asList("a", "b", "c", "d");
            List<String> limit = list.stream()
                    .limit(3)
                    .collect(Collectors.toList());
            System.out.println(limit);//[a, b, c]
    复制代码

5) 跳过 skip

    //跳过list的前两个值获取后面的值
    List<String> list = Arrays.asList("a", "b", "c", "d");
    List<String> skip = list.stream()
            .skip(2)
            .collect(Collectors.toList());
    System.out.println(skip);//[c, d]
    复制代码

6) 映射 map (常用)

    //将集合中的每一个元素转为字符串
            List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
            List<String> result = list.stream()
                    .map(x -> String.valueOf(x))
                    .collect(Collectors.toList()); 
            System.out.println(result);//[1, 2, 3, 4, 5]
    复制代码
    //        将字符串全部变成大写
            List<String> list = new ArrayList<>();
            list.add("zhangwuji");
            list.add("zhaomin");
            list.add("zhouzhiruo");
            List<String> collect = list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
            System.out.println(collect);//[ZHANGWUJI, ZHAOMIN, ZHOUZHIRUO]
    复制代码

7) 遍历 foreach(常用)

    //使用stream流进行遍历
    List<String> list = new ArrayList<>();
    list.add("张无忌");
    list.add("周芷若");
    list.add("赵敏");
    list.add("张强");
    list.add("张三丰");
    list.stream().forEach(name-> System.out.println(name)); 
    复制代码

202208062333321961.png

8) 排序 sorted

sorted方法用来流排序,默认升序排布,可以使用一个 Comparator 作为参数来实现自定义排序.

            //正序
            List<String> list = Arrays.asList("aa", "ff", "dd");
    //String 类自身已实现Compareable接口 
            list.stream().sorted().forEach(System.out::println);// aa dd ff
    复制代码
            //倒序
        public static Comparator<String> getComparator(){
            //方法的返回值类型是一个接口,那么我们可以返回这个接口的匿名内部类
    //        return new Comparator<String>() {
    //            @Override
    //            public int compare(String o1, String o2) {
    //                //按照字符串的降序排序
    //                return o2.length()-o1.length();
    //            }
    //        };
    
            //方法的返回值类型是一个函数式接口,所以可以返回一个lambda表达式
            return (o1, o2) -> o2.length()-o1.length();
        }
    
        public static void main(String[] args) {
            String[] arr = {"aaa","b","ccccc","dddddddddddd"};
            System.out.println(Arrays.toString(arr));//[aaa, b, ccccc, dddddddddddd]排序前
            Arrays.sort(arr,getComparator());
            System.out.println(Arrays.toString(arr));//[dddddddddddd, ccccc, aaa, b]排序后
        }
    复制代码
    public static void main(String[] args) {
    //自定义map的排序 根据
        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map1 = new HashMap<String, Object>();
        map1.put("name", "p");
        map1.put("cj", "5");
        Map<String, Object> map2 = new HashMap<String, Object>();
        map2.put("name", "h");
        map2.put("cj", "12");
        Map<String, Object> map3 = new HashMap<String, Object>();
        map3.put("name", "f");
        map3.put("cj", "31");
        list.add(map1);
        list.add(map3);
        list.add(map2);
        //排序前
        for (Map<String, Object> map : list) {
            System.out.println(map.get("cj"));
        }
        Collections.sort(list, (o1, o2) -> {
            Integer name1 = Integer.valueOf(o1.get("cj").toString()) ;//name1是从你list里面拿出来的一个
            Integer name2 = Integer.valueOf(o2.get("cj").toString()) ; //name1是从你list里面拿出来的第二个name
            return name2.compareTo(name1);
        });
        //排序后
        System.out.println("-------------------");
        for (Map<String, Object> map : list) {
            System.out.println(map);
        }
    }
    复制代码

结果:

202208062333331022.png

结尾

我本人也是一个小白,自己平时练习着玩的,以后会继续补充的,希望可以帮到你们。