JDK8---Stream流详解

一.概述

  • 在 Java 中,Stream 是一个来自java.util.stream包的接口,用于对集合(如List、Set等)或数组等数据源进行操作的一种抽象层。它可以让你以一种声明式的方式处理数据,更专注于 “做什么” 而不是 “怎么做”。简单来说,Stream 就像是一条数据的管道,数据在这个管道中流动,并且可以在流动的过程中被各种操作修改。
  • 对Stream流的操作可以分为三种:
    1. 创建流: 可以由数组或者集合创建.
    2. 中间操作: 每次返回一个新的流,可以有多个中间操作
    3. 终结操作: 每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合.
  • Stream流的特性:
    • 惰性求值(Lazy Evaluation):Stream流的中间操作(如filter、map、sorted等)是惰性求值的。这意味着当你定义了一系列中间操作时,这些操作并不会立即执行。只有当遇到终端操作(如forEach、reduce、collect等)时,整个操作链才会被触发执行
    • 不可变(Immutability): Stream 本身是不可变的。这意味着一旦一个 Stream 对象被创建,你不能修改它。每一个中间操作都会返回一个新的 Stream 对象,而不是在原始的 Stream 上进行修改。
    • 管道化(Pipelining): Stream 操作可以像管道一样串联起来。一个操作的输出可以作为下一个操作的输入,从而可以对数据进行连续的处理。这种管道化的方式使得代码更加紧凑和易读,并且能够高效地处理数据。
    • 内部迭代(Internal Iteration): 与传统的外部迭代(如使用for循环)不同,Stream 采用内部迭代。在传统的外部迭代中,你需要手动控制迭代的过程,例如,在一个for循环中,你要明确地指定循环的起始、结束条件和每次迭代的步长。而在 Stream 中,迭代的过程是由 Stream 库内部管理的,你只需要指定要对数据进行什么操作(通过中间操作和终端操作)。
    • 支持多种数据源和数据类型:
      • 数据源多样性:Stream 可以从各种数据源创建,如集合(List、Set、Map等)、数组、I/O 通道等。这使得它可以广泛地应用于不同的数据处理场景。
      • 数据类型多样性:它可以处理各种数据类型,包括基本数据类型(通过IntStream、LongStream、DoubleStream等专门的流)和引用数据类型。例如,可以创建一个IntStream来处理整数数组,也可以创建一个Stream<String>来处理字符串列表。

二.数据准备

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//用于后期的去重使用
public class Author {
   
   
    //id
    private Long id;
    //姓名
    private String name;
    //年龄
    private Integer age;
    //简介
    private String intro;
    //作品
    private List<Book> books;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode//用于后期的去重使用
public class Book {
   
   
    //id
    private Long id;
    //书名
    private String name;

    //分类
    private String category;

    //评分
    private Integer score;

    //简介
    private String intro;

}
private static List<Author> getAuthors() {
   
   
        //数据初始化
        Author author = new Author(1L,"蒙多",33,"一个从菜刀中明悟哲理的祖安人",null);
        Author author2 = new Author(2L,"亚拉索",15,"狂风也追逐不上他的思考速度",null);
        Author author3 = new Author(3L,"易",14,"是这个世界在限制他的思维",null);
        Author author4 = new Author(3L,"易",14,"是这个世界在限制他的思维",null);

        //书籍列表
        List<Book> books1 = new ArrayList<>();
        List<Book> books2 = new ArrayList<>();
        List<Book> books3 = new ArrayList<>();

        books1.add(new Book(1L,"刀的两侧是光明与黑暗","哲学,爱情",88,"用一把刀划分了爱恨"));
        books1.add(new Book(2L,"一个人不能死在同一把刀下","个人成长,爱情",99,"讲述如何从失败中明悟真理"));

        books2.add(new Book(3L,"那风吹不到的地方","哲学",85,"带你用思维去领略世界的尽头"));
        books2.add(new Book(3L,"那风吹不到的地方","哲学",85,"带你用思维去领略世界的尽头"));
        books2.add(new Book(4L,"吹或不吹","爱情,个人传记",56,"一个哲学家的恋爱观注定很难把他所在的时代理解"))
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值