首页 > 编程语言 >Java——Stream 流的使用详解

Java——Stream 流的使用详解

时间:2024-08-29 19:03:46浏览次数:6  
标签:Java Stream stream List list System 详解 println out

Stream   是一个可以用于操作集合、数组等数据源的API,主要进行数据的转换、筛选、聚合等操作

这样做可以避免显式地使用迭代器或者循环来操作集合,提高代码的可读性和简洁性

特点 : 

  1、无存储性: 是基于数据源的对象,本身不存储元素,而是通过管道将数据源元素传递给操作

  2、函数式编程:任何修改都不会修改背后的数据源,例如filter操作不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新的Stream

  3、可消费性:只能被消费一次,一旦遍历就会失效,类似于迭代器,想重新遍历需要重新生成

使用

  中间操作 :对流的一系列处理步骤,返回一个新的流,允许链式调用,通常对于数据进行过滤,映射,排除等操作

    1. filter():根据条件过滤元素
    2. map():将元素映射为新的值,有返回值
    3. sorted():对元素进行排序
    4. distinct():去重
    5. limit(Long maxSize):限制元素的数量
    6. skip(long n):跳过前n个元素
    7. flatMap():通常用于集合的扁平化
    8. peek():对流中元素执行指定操作,无返回值

举例如下:

public class IntermediateStream {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 5, 6, 6);
        //根据指定条件筛选元素
        //输出为[2,4,6]
        List<Integer> list1 = list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());
        System.out.println(list1);
        //将元素映射为新值或另一种类型
        List<Integer> list2 = list.stream().map(n -> n * 2).collect(Collectors.toList());
        System.out.println(list2);
        List<String> list3 = list.stream().map(n -> "Number" + n).collect(Collectors.toList());
        System.out.println(list3);
        //排序
        List<Integer> list4 = list.stream().sorted().collect(Collectors.toList());
        System.out.println(list4);
        //去重
        List<Integer> list5 = list.stream().distinct().collect(Collectors.toList());
        System.out.println(list5);
        //限制元素数量
        List<Integer> list6 = list.stream().limit(3).collect(Collectors.toList());
        System.out.println(list6);
        //跳过前n个元素
        List<Integer> list7 = list.stream().skip(3).collect(Collectors.toList());
        System.out.println(list7);
        //FlatMap()
        List<List<Integer>> list8=Arrays.asList(
                Arrays.asList(1,2),
                Arrays.asList(3,4,5),
                Arrays.asList(6,7,8,9,10)
        );
        List<Integer> flat=list8.stream().flatMap(Collection::stream).collect(Collectors.toList());
        System.out.println(flat);
        //peek()
        List<Integer> list9=list.stream().peek(n->System.out.println("Process element :"+n)).collect(Collectors.toList());
 
    }
}

  终端操作:流的最后一个步骤,它会触发对流的计算并产生一个最终结果

  1. forEach():对流中每个元素执行操作
  2. collect():将流中的元素收集到一个容器中
  3. toArray():将流中的元素收集到数组中
  4. reduce():对流中的元素进行归约处理操作,返回一个值
  5. count():返回流中元素的数量
  6. min():返回流中的最小元素
  7. max():返回流中的最大元素
  8. findFirst():返回流中的第一个元素
  9. findAny():返回流中的任意一个元素

举例如下:

public class TerminalStream {
    public static void main(String[] args) {
        //forEach
        List<String> list = Arrays.asList("Tom", "SuSan", "Lucy");
        list.stream().forEach(n -> System.out.println("Hello " + n));
        //toArray
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
        Integer[] numArray = list1.stream().toArray(Integer[]::new);
        //reduce(identity,accumulator)
        List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5, 6);
        int sum = list2.stream().reduce(0, (a, b) -> a + b);
        System.out.println(sum);
        //collect
        List<String> list3 = list.stream().collect(Collectors.toList());
        Set<String> set = list.stream().collect(Collectors.toSet());
        Map<String, Integer> map = list.stream().collect(Collectors.toMap(n -> n, String::length));
        System.out.println(list3);
        System.out.println(set);
        System.out.println(map);
        //min(comparator) max(comparator)
        Optional<Integer> min = list1.stream().min(Integer::compareTo);
        Optional<Integer> max = list1.stream().max(Integer::compareTo);
        //输出1
        System.out.println(min.orElse(0));
        //输出6
        System.out.println(max.orElse(0));
        //findFirst():返回流中的第一个元素
        //findAny():返回流中的任意一个元素
        Optional<String> first2=list.stream().findFirst();
        Optional<String> any2=list.stream().findAny();
        System.out.println(first2.orElse(null));
        System.out.println(any2.orElse(null));
    }
}

 

标签:Java,Stream,stream,List,list,System,详解,println,out
From: https://www.cnblogs.com/Yuansj0206/p/18387418

相关文章

  • Java中super关键字的学习
    super关键字目录super关键字1.访问父类的成员变量2.调用父类的方法3.调用父类的构造方法4.在实现接口的类中调用接口的默认方法注意事项在Java中,super是一个关键字,它主要用于在子类中引用父类的成员(包括字段、方法和构造方法),或者用于解决子类和父类之间的命名冲突。以下是s......
  • java毕业设计-基于springboot+vue的高校自习室预约系统设计和实现,基于springboot+vue
    文章目录前言演示视频项目架构和内容获取(文末获取)项目相关文件系统功能部分实现截图架构设计MVC的设计模式基于B/S的架构技术栈具体功能模块设计系统需求分析可行性分析系统测试为什么我?关于我我自己的网站项目开发案例前言博主介绍:✌️码农一枚,专注于大学生项目......
  • Java面试题--1基础篇-03 __八股文 备战春招,秋招
    八、泛型Java中的泛型是什么?泛型是JDK1.5的一个新特性,**泛型就是将类型参数化,其在编译时才确定具体的参数。**这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。使用泛型的好处是什么?远在JDK1.4版本的时候,那时候是没有泛型的概......
  • Java面试题--2集合篇-01 __八股文 备战春招,秋招
    1.常见的集合有哪些?Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue(Java5新增的队列),因此Java集合大致也可分成List、Set、Queue、Map四种接口体系。注意:Collection是一个接口,Collections是一个工具类,Map不是Collectio......
  • Java算法之Gnome 排序
    简介Gnome排序,又称为双向插入排序或鸡尾酒排序,是一种改进的插入排序算法。它在每次迭代中不仅将最小的元素移动到前面,同时也将最大的元素移动到后面。这种排序算法在每次迭代中同时向两个方向进行移动,因此得名。算法步骤从数组的两端开始,向中间进行扫描。如果左侧元素大于......
  • Java算法之基数排序(Radix Sort)
    简介基数排序是一种非比较型整数排序算法,其原理是按照低位先排序,然后收集,再按照高位排序,再收集,依次类推,直到最高位。这种方法可以视为对每个位上的数字进行稳定的排序。算法步骤确定最大数的位数。对每一位进行排序:从最低位开始,使用稳定的排序算法(如计数排序)对当前位进......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • MySQL 数据类型详解
    MySQL是一种广泛使用的关系型数据库管理系统,它支持多种数据类型以满足各种应用场景的需求。本文将详细介绍MySQL支持的数据类型、它们的使用场景以及实现原理,并通过图示帮助读者更直观地理解。目录简介数值类型整型浮点型定点型日期和时间类型字符串类型字符串二进制字......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • 你一定想知道的Redis数据库详解
    目录一、Redis介绍1.1定义1.2为什么要有Redis1.3Redis和Mysql的对比1.4Redis的一些常见命令二、Redis常见的数据结构一、字符串(String)二、哈希(Hash)三、列表(List)四、集合(Set)五、有序集合(SortedSet)三、Redis的应用场景四、实验练习4.1redis部署实验环境:实验......