Stream流

146 阅读4分钟

在Java中,Stream(流)是一种用于处理集合数据的高级抽象概念。Java Stream API 提供了一种功能强大且表达力高的方式来处理数据集合,包括集合、数组等。使用Stream,可以更简洁、更具表达力地进行数据转换、过滤、映射、聚合等操作,同时还能利用多核处理器进行并行操作。以下是Java Stream 流的一些主要作用:

  1. 函数式风格的数据处理: 使用Stream,你可以以函数式风格处理数据,通过链式调用方法来进行各种数据操作。这使代码更易读、易于组合和重用。

  2. 数据转换和映射: Stream提供了map操作,可以将一个元素映射为另一个元素,从而进行数据转换。例如,可以将一个集合中的每个元素映射为另一种类型的元素。

  3. 数据过滤: 使用filter操作,可以根据特定条件筛选出符合条件的元素。这在从大型数据集中提取所需数据时非常有用。

  4. 数据聚合和归约: Stream提供了reduce操作,可以对集合中的元素进行归约操作,例如计算总和、最大值、最小值等。

  5. 并行处理: Stream可以通过并行操作,在多核处理器上同时处理数据,从而提高处理速度。通过parallelStream()方法,可以将Stream转换为并行流。

  6. 延迟执行: Stream中的操作通常是延迟执行的,即只有在终止操作(如forEachcollect)被调用时,才会实际开始执行操作。这使得Stream可以对操作进行优化,例如只计算实际需要的数据。

  7. 流水线操作: Stream允许将多个操作连接成流水线,每个操作依次应用于流中的元素。这种方式使得代码结构清晰,易于理解。

  8. 简化代码: 使用Stream可以大大减少需要编写的中间临时变量和循环代码,使代码更加简洁。

stream 的一些基础代码

操作集合和数组的

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class StreamTest {
    public static void main(String[] args) {
        //stream流:操作数组或集合得一个知识点
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"陈某人","陈某某","陈陈某","某某人","陈某","某人");

        //需要找出:姓陈,并且名字为三个字得
        ArrayList<String> arrayList = new ArrayList<>();
        for (String s : list) {
            if (s.startsWith("陈") && s.length()==3){
                arrayList.add(s);
            }
        }
        System.out.println("---------------------------------");

        System.out.println(arrayList);

        //使用stream流实现这个需求
        List<String> strings = list.stream().filter(s -> s.startsWith("陈") && s.length() == 3)
            .collect(Collectors.toList());
        System.out.println(strings);
    }
}

Stream类流的创建


import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest {
    public static void main(String[] args) {

        //list
        List<String> list = new ArrayList<>();
        Collections.addAll(list,"陈某人","陈某某","陈陈某","某某人","陈某","某人");
        Stream<String> stream = list.stream();

        //set
        HashSet<String> set = new HashSet<>();
        Collections.addAll(set,"陈某人","陈某某","陈陈某","某某人","陈某","某人");
        Stream<String> stream1 = set.stream();

        //Map
        HashMap<String, Integer> map = new HashMap<>();

        //通过key  获取Stream流
        Set<String> keySet = map.keySet();
        Stream<String> stream2 = keySet.stream();

        //通过value  获取Stream流
        Collection<Integer> values = map.values();
        Stream<Integer> stream3 = values.stream();

        //通过entrySet获取Stream流
        Set<Map.Entry<String, Integer>> entries = map.entrySet();
        Stream<Map.Entry<String, Integer>> stream4 = entries.stream();

        //数组
        String[] names = {"陈某人","陈某某","陈陈某","某某人","陈某","某人"};
        //names.stream: idea快捷键生成Arrays.stream(names)
        Stream<String> stream5 = Arrays.stream(names);
        Stream<String> names1 = Stream.of(names);

    }
}

Stream类流的使用

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StudentDemo {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        Student s1 = new Student("张三", 20, 95.2);
        Student s2 = new Student("张四", 21, 54.2);
        Student s3 = new Student("张五", 22, 93.2);
        Student s4 = new Student("张六", 23, 42.2);
        Student s5 = new Student("张七", 24, 41.2);
        Student s6 = new Student("张八", 26, 90.2);
        Student s7 = new Student("张九", 19, 49.2);
        Student s8 = new Student("张十", 22, 88.2);

        Collections.addAll(list, s1, s2, s3, s4, s5, s6, s7, s8);

        System.out.println("======================输出高于60分的=========================");

        list.stream()
            //过滤
            .filter(student -> student.getScore() >= 60)
            //排序
            .sorted(Comparator.comparingDouble(Student::getScore))
            //遍历集合打印元素信息
            .forEach(System.out::println);

        System.out.println("======================输出年龄在23-30之内的=========================");

        //注意一:sorted有参方法:定义比较器,来定义排序顺序
        list.stream()
            .filter(student -> student.getAge() >= 23 && student.getAge() <= 30)
            .sorted((o1, o2) -> o2.getAge() - o1.getAge())
            .forEach(System.out::println);

        System.out.println("=====================取前三位==========================");

        //取出成绩最高的前三的学生,并输出  取集合前三的值
        list.stream()
            .sorted((o1, o2) -> Double.compare(o2.getScore(), o1.getScore()))
            .limit(3)
            .forEach(System.out::println);

        System.out.println("=====================取后三位==========================");

        //取最后三位
        list.stream()
            .sorted((o1, o2) -> Double.compare(o2.getScore(), o1.getScore()))
            //  减  3   就是取最后3位
            .skip(list.size() - 3)
            .forEach(System.out::println);

        System.out.println("===============打印超50分学生的名字,重复的去除==================");

        //打印超50分的学生的名字  有重复的去除
        list.stream().filter(student -> student.getScore() > 50)
            //加工:把student类型的元素转为String类型的元素
            .map(student -> student.getName())
            //去重
            .distinct()
            .forEach(System.out::println);

        System.out.println("===================使用CONCAT连续两个流========================");
        Stream<String> stream1 = Stream.of("张三", "李四", "王五");
        Stream<String> stream2 = Stream.of("李三", "张四", "梁五");

        Stream<String> concat = Stream.concat(stream1, stream2);
        concat.forEach(System.out::println);

        //打印超五十分的
        System.out.println("=================统计超50分的人数===================");

        long count = list.stream().filter(student -> student.getScore() > 50).count();
        System.out.println("人数为:" + count);

        System.out.println("=====================找出最高分的======================");

            //找出最高分的
            Student max = list.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
            System.out.println(max);

            System.out.println("=====================找出最低分的======================");

            Student min = list.stream().min((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
            System.out.println(min);

            System.out.println("=====================找出80分以上的======================");

            Set<Student> collect = list.stream().filter(student -> student.getScore() > 80).collect(Collectors.toSet());
            for (Student student : collect) {
            System.out.println(student);

            }

            System.out.println("=====================流只能用一次======================");

            Set<Student> collect1 = list.stream().filter(student1 -> student1.getScore() > 80).collect(Collectors.toSet());
            System.out.println(collect1);


            System.out.println("=====================找出80分以上的学生并存Map集合里======================");

            Map<String, Double> map = list.stream()
            .filter(student1 -> student1.getScore() > 80)
            .distinct()
            .collect(Collectors.toMap(student1 -> student1.getName(), student1 -> student1.getScore()));
            System.out.println(map);

            }
            
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Test02 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        String[] strings = {"张三", "李大牛", "压缩哈撒keO咯", "超级无敌奥特曼", "扇子妈", "女枪", "大炮", "飞机坦克", "超级无敌宇宙飞船", "女枪"};
        Collections.addAll(list, strings);



        System.out.println("==========最长的三个元素=============");
        list.stream().sorted((str, str1) -> str1.length() - str.length()).limit(3).distinct().forEach(System.out::println);

        System.out.println("===========最短的三个元素============");
        list.stream().distinct().sorted(Comparator.comparingInt(String::length)).limit(3).forEach(System.out::println);

        System.out.println("===========去重后集合的元素============");
        list.stream().distinct().forEach(System.out::println);

        System.out.println("===========遍历打印Set集合的元素============");
        list.stream().collect(Collectors.toSet()).forEach(System.out::println);

        System.out.println("==========遍历打印map集合的元素=============");
        list.stream().collect(Collectors.toMap(Function.identity(), s -> 1, Integer::sum)).forEach((key, value) -> System.out.println(key + "==" + value));

    }
}