Stream流的使用方法

Stream流

1.Stream流的创建

Collection提供的如下方法 说明
default Stream stream() 获取当前集合对象的stream流
Arrays类提供的如下方法
public static Stream stream(T[] array) 获取当前数组的stream流
Stream类提供的如下方法
public static Stream of(T... values) 获取当前接收数据的stream流

演示

public class StreamDemo2 {
    public static void main(String[] args) {
        // 目标:获取Stream流的方式。
        // 1、获取集合的Stream流:调用集合提供的stream()方法
        Collection<String> list = new ArrayList<>();
        Stream<String> s1 = list.stream();

        // 2、Map集合,怎么拿Stream流。
        Map<String, Integer> map = new HashMap<>();
        // 获取键流
        Stream<String> s2 = map.keySet().stream();
        // 获取值流
        Stream<Integer> s3 = map.values().stream();
        // 获取键值对流
        Stream<Map.Entry<String, Integer>> s4 = map.entrySet().stream();

        // 3、获取数组的流。
        String[] names = {"张三丰", "张无忌", "张翠山", "张良", "张学友"};
        Stream<String> s5 = Arrays.stream(names);
        System.out.println(s5.count()); // 5
        Stream<String> s6 = Stream.of(names);
        Stream<String> s7 = Stream.of("张三丰", "张无忌", "张翠山", "张良", "张学友");
    }
}

2.Stream流中间方法

Stream提供的常用中间方法 说明
Stream filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤。
Stream sorted() 对元素进行升序排序
Stream sorted(Comparator<? super T> comparator) 按照指定规则排序
Stream limit(long maxSize) 获取前几个元素
Stream skip(long n) 跳过前几个元素
Stream distinct() 去除流中重复的元素。
Stream map(Function<? super T,? extends R> mapper) 对元素进行加工,并返回对应的新流
static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流

演示

public class StreamDemo3 {
    public static void main(String[] args) {
        // 目标:掌握Stream提供的常用的中间方法,对流上的数据进行处理(返回新流:支持链式编程)
        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        list.add("张翠山");

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

        // 2、排序方法。
        List<Double> scores = new ArrayList<>();
        scores.add(88.6);
        scores.add(66.6);
        scores.add(66.6);
        scores.add(77.6);
        scores.add(77.6);
        scores.add(99.6);
        scores.stream().sorted().forEach(System.out::println); // 默认是升序。
        System.out.println("--------------------------------------------------");

        scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).forEach(System.out::println); // 降序
        System.out.println("--------------------------------------------------");

        scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).limit(2).forEach(System.out::println); // 只要前2名
        System.out.println("--------------------------------------------------");

        scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).skip(2).forEach(System.out::println); // 跳过前2名
        System.out.println("--------------------------------------------------");

        // 如果希望自定义对象能够去重复,重写对象的hashCode和equals方法,才可以去重复!
        scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).distinct().forEach(System.out::println); // 去重复

        // 映射/加工方法: 把流上原来的数据拿出来变成新数据又放到流上去。
        scores.stream().map(s -> "加10分后:" + (s + 10)).forEach(System.out::println);

        // 合并流:
        Stream<String> s1 = Stream.of("张三丰", "张无忌", "张翠山", "张良", "张学友");
        Stream<Integer> s2 = Stream.of(111, 22, 33, 44);
        Stream<Object> s3  = Stream.concat(s1, s2);
        System.out.println(s3.count());
    }
}

3.Stream流终结方法

Stream提供的常用终结方法 说明
void forEach(Consumer action) 对此流运算后的元素执行遍历
long count() 统计此流运算后的元素个数
Optional max(Comparator<? super T> comparator) 获取此流运算后的最大值元素
Optional min(Comparator<? super T> comparator) 获取此流运算后的最小值元素
R collect(Collector collector) 把流处理后的结果收集到一个指定的集合中去
Object[] toArray() 把流处理后的结果收集到一个数组中去

演示

public class StreamDemo4 {
    public static void main(String[] args) {
        // 目标:掌握Stream流的统计,收集操作(终结方法)
        List<Teacher> teachers = new ArrayList<>();
        teachers.add(new Teacher("张三", 23, 5000));
        teachers.add(new Teacher("金毛狮王", 54, 16000));
        teachers.add(new Teacher("李四", 24, 6000));
        teachers.add(new Teacher("王五", 25, 7000));
        teachers.add(new Teacher("白眉鹰王", 66, 108000));
        teachers.add(new Teacher("陈昆", 42, 48000));

        teachers.stream().filter(t -> t.getSalary() > 15000).forEach(System.out::println);

        System.out.println("--------------------------------------------------");

        long count = teachers.stream().filter(t -> t.getSalary() > 15000).count();
        System.out.println(count);

        System.out.println("--------------------------------------------------");

        // 获取薪水最高的老师对象
        Optional<Teacher> max = teachers.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        Teacher maxTeacher = max.get(); // 获取Optional对象中的元素
        System.out.println(maxTeacher);

        Optional<Teacher> min = teachers.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));
        Teacher minTeacher = min.get(); // 获取Optional对象中的元素
        System.out.println(minTeacher);

        System.out.println("---------------------------------------------------------");

        List<String> list = new ArrayList<>();
        list.add("张无忌");
        list.add("周芷若");
        list.add("赵敏");
        list.add("张强");
        list.add("张三丰");
        list.add("张三丰");
        list.add("张翠山");

        // 流只能收集一次

        // 收集到集合或者数组中去。
        Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
        // 收集到List集合
        List<String> list1 = s1.collect(Collectors.toList());
        System.out.println(list1);

        //Set<String> set2 = new HashSet<>();
        //set2.addAll(list1);

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

        // 收集到数组中去
        Stream<String> s3 = list.stream().filter(s -> s.startsWith("张"));
        Object[] array = s3.toArray();
        System.out.println("数组:" + Arrays.toString(array));

        System.out.println("------------------收集到Map集合---------------------------");

        // 收集到Map集合:键是老师名称,值是老师薪水
        Map<String, Double> map = teachers.stream().collect(Collectors.toMap(Teacher::getName, Teacher::getSalary));
        System.out.println(map);
    }
}

4.收集Stream流

Stream提供的常用终结方法 说明
R collect(Collector collector) 把流处理后的结果收集到一个指定的集合中去
Object[] toArray() 把流处理后的结果收集到一个数组中去
Collectors工具类提供了具体的收集方式
public static Collector toList() 把元素收集到List集合中
public static Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper ,Function valueMapper) 把元素收集到Map集合中

演示

public class Demo12StreamFinalMethod {

    public static void main(String[] args) {

        List<Teacher> ts = new ArrayList<>();
        ts.add(new Teacher(1, "Jack", 20));
        ts.add(new Teacher(2, "Jackson", 18));
        ts.add(new Teacher(3, "XiaoLi", 28));
        ts.add(new Teacher(4, "XiaoHua", 23));

        long count = ts.stream().count();
        System.out.println("count = " + count);

        System.out.println("------------------------");
        Optional<Teacher> max = ts.stream().max((o1, o2) -> o1.getAge() - o2.getAge());
        Teacher maxTeacher = max.get();
        System.out.println(maxTeacher);
        System.out.println("------------------------");

        Optional<Teacher> min = ts.stream().min((o1, o2) -> o1.getAge() - o2.getAge());
        Teacher minTeacher = min.get();
        System.out.println(minTeacher);
        System.out.println("------------------------");

        //收集新集合
        List<Teacher> list = ts.stream().collect(Collectors.toList());
        System.out.println(list);
        
        Set<Teacher> set = ts.stream().collect(Collectors.toSet());
        System.out.println(set);
        
        //Teacher::getId
        //Map<Object, Object> map = ts.stream().collect(Collectors.toMap(teacher -> teacher.getId(), teacher -> teacher));
        //修改写法
        Map<Object, Object> map = ts.stream().collect(Collectors.toMap(Teacher::getId, v -> v));
        System.out.println(map);

        //收集数组
        Teacher[] array = ts.stream().toArray(value -> new Teacher[list.size()]);
        System.out.println(array);

    }

}
posted @ 2025-02-23 13:47  林之听风  阅读(110)  评论(0)    收藏  举报