• java_Stream API


    一、Stream API vs 集合

    • Stream API 关注的是多个数据的计算(排序、查找、过滤、映射、遍历等),面向CPU。集合关注的是数据的存储,面向内存。
    • Stream API 之于 集合,类似于 SQL 之于 数据表的查询。

    二、Stream 使用的执行流程

    • 1.创建Stream

    一个数据源(如:集合、数组),获取一个流

    • 2.中间操作

    多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值

    • 3.终止操作

    终端操作会从流的流水线生成结果

    2.1、创建Stream

    • 1.通过集合
    @Test
    public void test(){
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        //JDK1.8中,Collection系列集合增加了方法
        Stream<Integer> stream = list.stream();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Java8 中的 Collection 接口被扩展,提供了两个获取流的方法
    1.default Stream stream() : 返回一个顺序流 2.default Stream parallelStream() : 返回一个并行流

    • 2.通过数组
    @Test
    public void test(){
    	String[] arr = {"hello","world"};
        Stream<String> stream = Arrays.stream(arr); 
    
        int[] arr = {1,2,3,4,5};
        IntStream stream = Arrays.stream(arr);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 3.通过Stream的of()
    @Test
    public void test04(){
        Stream<Integer> stream = Stream.of(1,2,3,4,5);
    }
    
    • 1
    • 2
    • 3
    • 4

    2.2、中间操作

    2.2.1. filter

    从流中排除某些元素

    	public static void main(String[] args) {
            List<Person> list = new ArrayList<>();
            Person p1 = new Person(1,"xixi");
            Person p2 = new Person(3,"haha");
            list.add(p1);
            list.add(p2);
            list.stream().filter(person -> person.getAge() > 2).forEach(System.out :: println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.2.2. limit

    使元素不超过指定数量

    	public static void main(String[] args) {
            List<Person> list = new ArrayList<>();
            Person p1 = new Person(1,"xixi");
            Person p2 = new Person(3,"haha");
            list.add(p1);
            list.add(p2);
            list.stream().limit(1).forEach(System.out :: println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.2.3. skip

    跳过前面n个元素

    	public static void main(String[] args) {
            List<Person> list = new ArrayList<>();
            Person p1 = new Person(1,"xixi");
            Person p2 = new Person(3,"haha");
            Person p3 = new Person(5,"yiyi");
            list.add(p1);
            list.add(p2);
            list.add(p3);
            list.stream().skip(2).forEach(System.out :: println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    2.2.4. distinct

    通过流中元素的hashCode()和equals()方法,去除重复元素

    2.2.5. map

    映射,将元素转换为其他形式或提取信息

    	 public static void main(String[] args) {
            List<String> list = Arrays.asList("aa", "bb", "cc");
            /* 1.lmabda表达式 */
            list.stream().map(item -> item.toUpperCase()).forEach(System.out :: println);
            /* 2.方法引用 */
            list.stream().map(String :: toUpperCase).forEach(System.out :: println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2.2.6. sorted

    排序,自然排序或定制化排序

    	public static void main(String[] args) {
    	    // 自然排序
            Integer[] arr = new Integer[]{345,3,64,3,46};
            Arrays.stream(arr).sorted().forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    	public static void main(String[] args) {
            // 定制化排序
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(2, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            list.stream().sorted((e1, e2) -> p1.getAge() - p2.getAge()).forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    2.3、终止操作

    2.3.1、allMatch(pridicate p)

    检查是否匹配所有元素

    	public static void main(String[] args) {
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(2, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            System.out.println(list.stream().allMatch(person -> person.getAge() > 10));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.3.2、anyMatch(pridicate p)

    检查是否至少匹配一个元素

    	public static void main(String[] args) {
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(2, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            System.out.println(list.stream().anyMatch(person -> person.getAge() > 10));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.3.3、findFirst()

    返回第一个元素

    	public static void main(String[] args) {
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(2, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            System.out.println(list.stream().findFirst().get());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.3.4、count()

    返回流中的总个数

    	public static void main(String[] args) {
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(2, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            System.out.println(list.stream().count());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    2.3.5、max(Comparator c) & min(Comparator c)

    返回流中的最大值和最小值

    	public static void main(String[] args) {
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(2, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            System.out.println(list.stream().map(Person::getAge).max(Integer::compare).get());
            System.out.println(list.stream().map(Person::getAge).min(Integer::compare).get());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    2.3.6、forEach(Consumer c)

    内部迭代

    	public static void main(String[] args) {
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(2, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            // 针对于集合,JDK8中增加了一个遍历的方法
            list.forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    2.3.7、reduce(T identity, BinaryOperator)

    将流中元素反复结合起来,得到一个值

    	public static void main(String[] args) {
            List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
            // 1.无初始值
            System.out.println(list.stream().reduce((x1, x2) -> x1 + x2).get());
            System.out.println(list.stream().reduce((x1, x2) -> Integer.sum(x1, x2)).get());
            System.out.println(list.stream().reduce(Integer::sum).get());
            // 2.有初始值
            System.out.println(list.stream().reduce(10, (x1, x2) -> x1 + x2));
            System.out.println(list.stream().reduce(10, (x1, x2) -> Integer.sum(x1, x2)));
            System.out.println(list.stream().reduce(10, Integer::sum));
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    2.3.8、collect(Collector c)

    将流转换为其他形式

    	public static void main(String[] args) {
            Person p1 = new Person(12, "xixi");
            Person p2 = new Person(1, "haha");
            List<Person> list = new ArrayList<>();
            list.add(p1);
            list.add(p2);
            // collectors里有很多方法,可以转为不同的形式
            List<Person> resList = list.stream().filter(p -> p.getAge() > 10).collect(Collectors.toList());
            resList.forEach(System.out::println);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    三、Stream 使用总结

    • Stream 自己不会存储元素
    • Stream 不会改变源对象
    • Stream 操作是延迟执行的。这意味着会等到需要结果的时候才执行。即一旦执行终止操作,就执行中间操作链,并产生结果
    • Stream一旦执行了终止操作,就不能再调用其它中间操作或终止操作了
  • 相关阅读:
    洛谷--欢乐的跳
    Java--XML简介
    openssl客户端编程:一个不起眼的函数导致的SSL会话失败问题
    吴峰光杀进 Linux 内核
    决策树 | 分类树&回归树:算法逻辑
    如何在三维地球加载SQL Server、MySql、PostgreSQL的矢量数据?
    [Model.py 02]Modification for creating terrain matrix2.
    react-router-dom V6 路由
    正则表达式
    sping
  • 原文地址:https://blog.csdn.net/qq_43563660/article/details/133845989