Java 8 Stream操作的介绍

什么是Stream?

Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。


image.png

如何创建Stream

list.stream() //转换成流进行操作

Stream 操作符的分类

主要分为两种:中间操作符和结束操作符

中间操作符:Lambda表达式的链式操作,可以链式对流进行操作,操作完后还是返回流

结束操作符:用来结束流的,数据经过中间加工操作,最后通过结束操作符对数据进行收集或者消费的,数据到了结束操作这里就不会向下流动了,结束操作符只能使用一次


中间操作符例子

1.filter
     /**
     * 用于过滤不满足条件的元素
     */
    @Test
    public void filter(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        List<String> filtered = list.stream().filter(str -> str.contains("峰")).collect(Collectors.toList());
        System.out.println(filtered);
    }
2.distinct
    /**
     * 用于去掉重复的元素
     */
    @Test
    public void distinct(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        List<String> distincted = list.stream().distinct().collect(Collectors.toList());
        System.out.println(distincted);
    }
3.limit
/**
     * 用于获取前n个元素
     */
    @Test
    public void limit(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        List<String> limited = list.stream().limit(3).collect(Collectors.toList());
        System.out.println(limited);
    }
4.skip
    /**
     * 用于获取除前n个元素以外的所有元素
     */
    @Test
    public void skip(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        List<String> skiped = list.stream().skip(3).collect(Collectors.toList());
        System.out.println(skiped);
    }
5.map
    /**
     * 用于对所有元素进行集体的操作
     */
    @Test
    public void map(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        List<String> mapped = list.stream().map(str->"帅哥姓名是->"+str).collect(Collectors.toList());
        System.out.println(mapped);
    }

对流中的每一个元素进行处理

6.flatmap
/**
     * 用于对所有元素进行扁平化的操作
     */
    @Test
    public void flatMap(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        List<Character> flatMaped = list.stream().flatMap(str -> javaStream.getCharacter(str)).collect(Collectors.toList());
        System.out.println(flatMaped);
    }

    //创建了一个字符流转换的方法
    public static Stream<Character> getCharacter(String str){
        ArrayList<Character> list = new ArrayList<>();
        for (Character character : str.toCharArray()) {
                list.add(character);
        }
        return list.stream();
    }

流扁平化,让你把一个流中的“每个值”都换成另一个流,然后把所有的流连接起来成为一个流总结: map是对一级元素进行操作,flatmap是对二级元素操作。

7.sorted
/**
     * 用于对所有元素进行以a到z顺序进行排序
     */
    @Test
    public void sorted(){
        //---------------------------字母排序-------------------------------------
        List<String> list = Arrays.asList("abc","sd","as","few","wth","dfg","as");
        List<String> sorted = list.stream().sorted().collect(Collectors.toList());//正序
        List<String> collect1 = list.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.US))).collect(Collectors.toList());
        System.out.println(sorted);
        System.out.println(collect1);
        //---------------------------汉字排序-------------------------------------
       List<String> list3 = Arrays.asList("吕布","刘备","阿斗","赵云","张辽","马超","法正");
        List<String> sorted1 = list3.stream().sorted(Collator.getInstance(Locale.CHINA)).collect(Collectors.toList());//正序
        List<String> collect2 = list3.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.CHINA))).collect(Collectors.toList());
        System.out.println(sorted1);
        System.out.println(collect2);
        //---------------------------数字排序-------------------------------------
        List<Integer> list1 = Arrays.asList(1,5,9,54,33,-52,54);
        List<Integer> collect = list1.stream().sorted().collect(Collectors.toList());//正序
        Stream<Integer> sorted2 = list1.stream().sorted(Collections.reverseOrder());//反序
        System.out.println(collect);
        sorted2.forEach(s-> System.out.print(s+","));
    }

image.png

and so on


结束操作符例子

1.anyMatch
    /**
     * 用于判断集合中是否有一个元素满足条件
     */
    @Test
    public void anyMatch(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        boolean a = list.stream().anyMatch(s -> s.contains("峰"));
        System.out.println(a);

2.allMatch
    /**
   * 用于判断集合中是否所有元素都满足条件
     */
    @Test
    public void allMatch(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        boolean a = list.stream().allMatch(s -> s.contains("峰"));
        System.out.println(a);
    }

3.forEach
    /**
     * 用于循环
     */
    @Test
    public void forEach(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        list.stream().forEach(s -> System.out.println(s));
    }

4.collect
  /**
     * 用于将流转换成其他类型的数据:list,map,set
     */
    @Test
    public void collect(){
         List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        Set<String> collect = list.stream().collect(Collectors.toSet());
        System.out.println(collect);

    }


5.count
  /**
     * 获取集合中元素的数量
     */
    @Test
    public void count(){
        List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
        long count = list.stream().count();
        System.out.println(count);
    }



6.groupingBy
     /*分组*/
     public static void group(){
        Map<Integer, List<User>> map = users().stream()
                .collect(Collectors.groupingBy(User::getSex));
        System.out.println(new Gson().toJson(map));
        System.out.println();
        Map<Integer, Map<Integer,List<User>>> map2 = users().stream()
                .collect(Collectors.groupingBy(User::getSex,
                        Collectors.groupingBy(User::getAge)));
        System.out.println(new Gson().toJson(map2));
    }
7.maxBy、minBy
 public static void max_min(){
        List<User> list = users();
        Optional<User> max = list.stream()
                .collect(
                        Collectors.maxBy(
                                Comparator.comparing(User::getAge)
                        )
                );
        Optional<User> min = list.stream()
                .collect(
                        Collectors.minBy(
                                Comparator.comparing(User::getAge)
                  )
                );
        System.out.println("max--> " + max+"  min--> "+ min);

and so on


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容