Ⅰ.介绍

      题外话,又有一个月未写一点东西了,博客都要长草了😂。
      Stream,流的意思。为处理数据集合而生的工具,对集合中的元素进行筛选、排序、聚合、变换,最终获得需要的结果。

Ⅱ.详细简介

1.分组

      先介绍一下stream的集合分组吧,今天主要想写这个。

    public static void main(String[] args) {

        //new一个集合
        List> mapList=new ArrayList>(){{
            add(new HashMap(){{
                put("name","jack");
                put("age","20");
                put("gender","male");
                put("class","one");
            }});
            add(new HashMap(){{
                put("name","rose");
                put("age","18");
                put("gender","female");
                put("class","one");
            }});
            add(new HashMap(){{
                put("name","jack");
                put("age","18");
                put("gender","male");
                put("class","two");
            }});
            add(new HashMap(){{
                put("name","rose");
                put("age","17");
                put("gender","female");
                put("class","two");
            }});
        }};

        //根据名字name分组
       Map>> stringListMap= mapList.stream()
                   .collect(Collectors.groupingBy(map-> map.get("name").toString()));

        System.out.println(stringListMap);
    }
//输出结果:{rose=[{gender=female, name=rose, class=one, age=18}, {gender=female, name=rose, class=two, age=17}],
 //jack=[{gender=male, name=jack, class=one, age=20}, {gender=male, name=jack, class=two, age=18}]}

2.筛选

      集合的筛选也是常规操作了。目的是为了留下需要的元素,剔除不需要的。

    public static void main(String[] args) {

        //生成一个集合
        List list = Arrays.asList("1,2,3,4,5,6,7,2".split(","));

        //distinct()是为了排重
        list.stream().distinct().forEach(System.out::print);
        System.out.println();
        //输出1234567

        //skip()是跳过前面的几个元素
        list.stream().skip(3).forEach(System.out::print);
        System.out.println();
        //输出45672

        //filter() 对元素进行判断 返回boolean来判断是否从流中剔除掉
        list.stream().filter(string->!string.equals("2")).forEach(System.out::print);
        //输出134567

    }

      除此之外,还有limit()方法是为了限制输出前几个元素。

3.排序

      虽然List已经有排序方法sort()了,但我要讲的这个排序是stream流里面的sorted()。

    public static void main(String[] args) {

        //生成一个集合
        List list = new ArrayList(){{
            add(5);
            add(1);
            add(3);
            add(2);
        }};
        List> mapList = new ArrayList>(){{
            add(new LinkedHashMap(){{
                put("name","jack");
                put("age","22");
                put("gender","male");
                put("class","two");
            }});
            add(new LinkedHashMap(){{
                put("name","rose");
                put("age","21");
                put("gender","female");
                put("class","two");
            }});
            add(new LinkedHashMap(){{
                put("name","jack");
                put("age","20");
                put("gender","male");
                put("class","one");
            }});
            add(new LinkedHashMap(){{
                put("name","rose");
                put("age","18");
                put("gender","female");
                put("class","one");
            }});
        }};

        //自然排序
        list.stream().sorted().forEach(System.out::print);
        System.out.println();
        //输出1235

        //根据name和age递增排序
       mapList.stream()
               .sorted(Comparator.comparing(a->a.get("name").toString()+a.get("age")))
               .forEach(System.out::print);
        //输出{name=jack, age=20, gender=male, class=one}{name=jack, age=22, gender=male, class=two}
        // {name=rose, age=18, gender=female, class=one}{name=rose, age=21, gender=female, class=two}

    }


      Comparator接口除了comparing()方法外,还有thenComparing()方法是进一步的排序,reversed()方法是为了反转排序。

4.映射变换

      Stream的map()方法是转换集合里面的元素到另一种类型或者形态。

    public static void main(String[] args) {

        List list= Arrays.asList("1,2,3,4,5".split(","));

        //改变值
        list.stream().map(s -> "P"+s).forEach(System.out::print);
        System.out.println();
        //输出P1P2P3P4P5

        //改变类型
        list.stream().map(a->{
            if("1".equals(a)){
                return true;
            }
            return false;
        }).forEach(System.out::print);

    }



      还有mapToDouble()、mapToInt()、mapToLong()方法进行映射,只不过对返回的类型都做了限定。

5.其它

      还有一些其它的方法,allMatch()就是如果全匹配就返回true,anyMatch()只要有匹配的就返回true,flatMap()是为了把流中的集合转换成一个流,如Stream<List>转换未Stream

Ⅲ.总结

      Stream的使用大大的提高了集合操作的开发效率。现在暂时就草草的总结一波吧,等有了更深的了解再详细讲解吧😀。

查看评论 - NOTHING

Comments | NOTHING

暂无评论

Markdown Supported while Forbidden

戳我试试 OωO 嘿嘿嘿 ヾ(≧∇≦*)ゝ

  切换主题 | SCHEME TOOL