一、Stream流简介

Stream也叫Stream流,是Jdk8开始新增的一套API (java.util.stream.),可以用于操作集合或者数组的数据。
优势: Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。

使用stream流:

 public static void main(String[] args) {
        // Stream流的使用
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");

       //  1、拿出姓张的放到新集合中去。
//        List<String> newList = new ArrayList<>();
//        for (String s : list) {
//            if(s.startsWith("张") && s.length() == 3) {
//                newList.add(s);
//            }
//        }
//        System.out.println(newList);

        // 2、使用Stream流
        List<String> newList = list.stream().filter(s -> s.startsWith("张") && s.length() == 3).collect(Collectors.toList());
        System.out.println(newList);
    }

运行结果:

在这里插入图片描述

二、使用Stream流

使用Stream流步骤:
1.获取Stream流,
2.调用方法,
3.获取结果。

1.获取Stream流:

  public static void main(String[] args) {
        // 获取Stream流。
        // 1、获取集合的Stream流:  default Stream<E> stream()
        Collection<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若","赵敏","张强","张三丰");
        Stream<String> listS = list.stream();
        System.out.println(listS.count());//打印数量;

        // 2、获取Map集合的Stream流。
        Map<String,Integer> map = new HashMap<>();
        // 1)、获取键流。
        Stream<String> keyS = map.keySet().stream();
        // 2)、获取值流。
        Stream<Integer> valueS = map.values().stream();
        // 3)、获取键值对流。
        Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();

        // 3、获取数组的Stream
        String[] names = {"赵敏", "王菲", "小昭"};
        Stream<String> stream1 = Arrays.stream(names);
        Stream<String> stream2 = Stream.of(names);
    }

2.Stream流常见的方法:

   public static void main(String[] args) {
        // Stream流的常见方法。
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若","赵敏","张强","张三丰");

        // 1、过滤方法
        list.stream().filter(s ->  s.startsWith("张") ).filter(s ->s.length() == 3).forEach(s -> System.out.println(s));
    }
   public static void main(String[] args) {
  // tream流的常见方法。
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张无忌", "周芷若","赵敏","张强","张三丰");

        // 1、过滤方法
        list.stream().filter(s ->  s.startsWith("张") ).forEach(s -> System.out.println(s));

        // 2、准备一个集合,排序。
        List<Movie> movies = new ArrayList<>();
        movies.add(new Movie("摔跤吧,爸爸", 9.5, "阿米尔汗"));
        movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
        movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
        movies.add(new Movie("阿甘正传", 7.5, "汤姆汉克斯"));

        // 集合中如果存储对象,方式一:对象类可以实现Comparable接口,指定比较规则
        // sorted方法就可以按照规则进行排序,否则报错!
        movies.stream().sorted().forEach(s -> System.out.println(s));
        System.out.println("-----------------------------------------------01");
        movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
                .forEach(System.out::println);

        // 3、limit取前几个
        System.out.println("-----------------------------------------------limit ");
        movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
                .limit(2).forEach(System.out::println);

        // 4、跳过前几个skip
        System.out.println("-----------------------------------------------skip ");
        movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
                .skip(1).forEach(System.out::println);

        // 5、distinct去重复
        System.out.println("----------------------------------------------- distinct");
        // 去重复:需要重写对象类的hashCode和equals方法
        movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
                .distinct().forEach(System.out::println);

        // 6、map加工方法:把流上的数据加工成新数据。
        System.out.println("-----------------------------------------------map加工");
        movies.stream().map(m -> {
            m.setScore(m.getScore() + 2);
            return m;
        }).forEach(System.out::println);

        // 7、合并流。
        // 把两个流接起来 。
        Stream<String> s1 = Stream.of("张三", "楚留香", "西门牛牛");
        Stream<String> s2 = Stream.of("李四", "石景山");
        Stream<String> allStream = Stream.concat(s1, s2);
        long count = allStream.count(); // count:统计个数
        System.out.println(count);
    }

运行如图:
在这里插入图片描述

  1. Stream流的常见终结方法
 public static void main(String[] args) {
        // Stream流的常见终结方法。
        List<Movie> movies = new ArrayList<>();
        movies.add(new Movie("摔跤吧,爸爸", 9.5, "阿米尔汗0"));
        movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗1"));
        movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
        movies.add(new Movie("阿甘正传", 7.5, "汤姆汉克斯"));

        // 1、forEach
        movies.stream().forEach(System.out::println);

        System.out.println("-----------------------------------------------01");
        // 2、count
        long count = movies.stream().skip(2).count();
        System.out.println(count);
        // 3、取最大值
        Movie movie = movies.stream().max((m1, m2) -> Double.compare(m1.getScore(), m2.getScore())).get();
        System.out.println(movie);

        Movie movie2 = movies.stream().min((m1, m2) -> Double.compare(m1.getScore(), m2.getScore())).get();
        System.out.println(movie2);

        // 4、收集Stream流:把流中的数据恢复到集合或者数组中去。
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        list.add("张三丰");

        // 收集到List集合
        List<String> names = list.stream().filter(s -> s.startsWith("张")).collect(Collectors.toList());
        System.out.println(names);
        names.add("张麻子");
        System.out.println(names);

        // 收集到Set集合
        Set<String> names2 = list.stream().filter(s -> s.startsWith("张")).collect(Collectors.toSet());
        System.out.println(names2);
        names2.add("张麻子");
        System.out.println(names2);

        // 收集到数组
        Object[] names3 = list.stream().filter(s -> s.length() == 3).toArray();
        System.out.println(Arrays.toString(names3));

        // 拓展
//        String[] names4 = list.stream().filter(s -> s.length() == 3).toArray(String[]::new);
//        System.out.println(Arrays.toString(names4));

        // 收到到Map集合。
        List<Movie> movies1 = new ArrayList<>();
        movies1.add(new Movie("摔跤吧,爸爸", 9.5, "阿米尔汗"));
        movies1.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
        movies1.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
        movies1.add(new Movie("阿甘正传", 7.5, "汤姆汉克斯"));

        Map<String, Double> map = movies1.stream().distinct().collect(Collectors.toMap(m -> m.getName(), m -> m.getScore()));
        System.out.println(map);
    }
posted on 2026-03-03 23:07  努力--坚持  阅读(42)  评论(0)    收藏  举报