函数式编程-Stream流学习第二节-中间操作

2023-11-06

1 Stream流概述

java8使用的是函数式编程模式,如同它的名字一样,它可以用来对集合或者数组进行链状流式操作,让我们更方便的对集合或者数组进行操作。

2 案例准备工作

我们首先创建2个类一个作家类,一个图书类

package com.stream.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @author xiDi
 * @data 2023/8/22
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//后期去重
public class Author implements Comparable<Author>{
    /**
     * id
     */
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 简介
     */
    private String intro;
    /**
     * 图书作品
     */
    private List<Book> bookList;

    @Override
    public int compareTo(Author o) {
        return o.getAge()-this.getAge();
    }
}
package com.stream.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

/**
 * @author xiDi
 * @data 2023/8/22
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//后期去重
public class Book {
    /**
     * id
     */
    private Long id;
    /**
     * 书名
     */
    private String bookName;
    /**
     * 分类
     */
    private String category;
    /**
     * 评分
     */
    private Integer score;
    /**
     * 图书简介
     */
    private String bookIntro;
}

然后我们进行数据初始化

  public static List<Author> getAuthor() {
        //数据初始化
        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> bookList = new ArrayList<>();
        List<Book> bookList2 = new ArrayList<>();
        List<Book> bookList3 = new ArrayList<>();
        bookList.add(new Book(1L, "英雄联盟", "爱情,游戏", 80, "双手成就梦想"));
        bookList.add(new Book(2L, "CF", "金钱,游戏", 60, "无兄弟,无CF"));

        bookList2.add(new Book(3L, "CSGO", "哲学", 85, "内格夫"));
        bookList2.add(new Book(3L, "CSGO", "哲学,神仙", 85, "内格夫"));
        bookList2.add(new Book(4L, "王者荣耀", "农药", 60, "有钱就是D"));

        bookList3.add(new Book(5L, "钢铁雄心4", "战争,历史", 90, "人均甲级战犯"));
        bookList3.add(new Book(6L, "PUBG", "开挂,神仙", 59, "会玩就是挂?"));
        bookList3.add(new Book(6L, "PUBG", "开挂,神仙", 59, "会玩就是挂?"));

        author.setBookList(bookList);
        author2.setBookList(bookList2);
        author3.setBookList(bookList3);
        author4.setBookList(bookList3);

        return Arrays.asList(author, author2, author3, author4);
    }

3 具体方法

3.1 中间操作filter

我们要求打印姓名大于1的作家姓名,可以用到filter关键字,它的作用是过滤

我们第一步呢,就是要创建流,List创建流就是在集合后面.stream就创建了。数组创建流,使用

Arrays.stream()方法来创建

在根据我们前面学到的lambda表达式,代码就可以简写这样

 //打印作家姓名大于1的作家姓名
    private static void test02() {
        List<Author> author = getAuthor();
        author.stream().filter(item -> item.getName().length() > 1).forEach(item -> System.out.println(item.getName()));

    }

输出结果:

 3.2 中间操作 map、distinct

map的作用是流中元素进行计算或者转换,distinctd的作用是去重

 //打印所有作家姓名,去重
    private static void test03() {
        List<Author> author = getAuthor();
        List<String> collect = author.stream().map(Author::getName).distinct().collect(Collectors.toList());
        System.out.println(collect);
    }

输出结果

 除了可以用map拿到我们想要的数据,我们还可以用它来对数据进行处理

 //所有作家的年龄加10,并全部打印
    private static void test04() {
        List<Author> author = getAuthor();
        List<Integer> collect = author.stream().map(Author::getAge).map(age -> age + 10).collect(Collectors.toList());
        System.out.println(collect);
    }

输出结果

 3.3 中间操作 sorted

注意:调用空参的sorted方法需要流中的元素实现compareTo方法,才能实现排序,否则会报错
//按照年龄升序并输出姓名  --调用空参的sorted方法需要流中的元素实现compareTo方法,才能实现排序,否则会报错
    private static void test05() {
        List<Author> author = getAuthor();
        List<String> collect = author.stream().sorted().map(Author::getName).collect(Collectors.toList());
        for (String item : collect) {
            System.out.println(item);
        }
    }

我们调用空参的sorted方法的话需要我们流中的元素实现Comparable,并且重写compareTo方法,重写的逻辑就是看你想要实现什么排序,比我这里实现的是根据年龄去排序

 输出结果

3.4 中间操作 limit、skip

limit的作用是限制,skip的作用是跳过

  //输出年龄最大的2位作家名称,并去重  --limit 限制
    private static void test06() {
        List<Author> author = getAuthor();
        List<String> collect = author.stream().sorted().map(Author::getName).distinct().limit(2).collect(Collectors.toList());
        for (String item : collect) {
            System.out.println(item);
        }

    }

这里我们用来limit来实现只要年龄前2位的作家名称

//输出年龄最大作家外的其他作家名称,并去重   --skip跳过流中前n个元素
    private static void test07() {
        List<Author> author = getAuthor();
        List<String> collect = author.stream().sorted().map(Author::getName).distinct().skip(1).collect(Collectors.toList());
        for (String item : collect) {
            System.out.println(item);
        }

    }

我们想要输出除年龄最大外的作家名称,那么我们需要排序后,在跳过第一个即可

3.5 中间操作 faltMap

faltMap可以把一个对象转换为多个对象作为流中的元素

//输出所有图书名,并去重
    private static void test08() {
        List<Author> author = getAuthor();
        List<String> collect = author.stream().flatMap(item->item.getBookList().stream()
        ).map(Book::getBookName).distinct().collect(Collectors.toList());
        for (String item : collect) {
            System.out.println(item);
        }
    }

输出结果

 4 总结

Stream还是很简单和方便的,因为我也是刚学,使用比较少,所以介绍比较笼统和简单,但是只要实操一下,就能很快记住

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数式编程-Stream流学习第二节-中间操作 的相关文章

  • 用jmeter进行http接口测试详解

    前言 本文主要针对http接口进行测试 使用Jmeter工具实现 Jmter工具设计之初是用于做性能测试的 它在实现对各种接口的调用方面已经做的比较成熟 因此 本次直接使用Jmeter工具来完成对Http接口的测试 同时 我也为大家准备了一
  • KY275 对称平方数

    KY275 对称平方数 for i in range 1 256 square str i i if square square 1 print i
  • 批量执行定时任务_执行批量维护任务安全策略

    批量执行定时任务 介绍 Introduction You may see it more commonly referenced as Database Instance File Initialization DIFI If you ar
  • 接口测试工具——Postman使用详解

    目录 Postman简介 Postman主界面 菜单栏 工具栏 请求管理区 环境管理区 请求设计区 发送请求 发送GET请求 Postman发送GET请求 发送表单格式POST请求 发送JSON格式POST请求 发送XML格式POST请求
  • “invalid method declaration; return type required“

    kinda 在书面英语中使用 表示非正式发音时的 kind of 主要用作为副词 作副词时译为 有点 有几分 常用搭配 kinda like https blog csdn net qiansg123 article details 801
  • Visual studio 2019 之 如何创建一个C++项目?

    1 打开软件 进入下面的界面 点击创建新项目 2 选择空项目 点击下一步 备注 这里的选项和安装软件时 你所安装的组件有关 3 配置新项目 编辑一个自己的项目名字 选择一个保存的文件夹 然后点击右下角的创建 4 这就是项目创建后的界面 左侧
  • Python 第三方模块 数据分析 Pandas模块 时间对象与时间序列

    一 日期和时间数据类型 1 相关模块 参见 Python 内置模块 时间 部分 2 时间戳的Null值 Pandas中用pd NaT Not a Time 表示时间戳数据的Null值 gt gt gt pd NaT NaT gt gt gt

随机推荐

  • 安装MinGW-64 (学习笔记)

    安装MinGW 64 MinGW w64是windows版的GCC编译器 c c 编译调试 下载官网地址 往下拉页面看到下图所示 两种安装方式 方式一 在线安装 Version GCC版本 如果没有特殊的需求 一般选择最高的版本号即可 Ar
  • taro开发微信小程序禁止下拉刷新(ios下拉出现空白问题)

    一 问题描述 最近用tarojs在做一个小程序项目时 首页需要禁止下拉刷新 于是在page json里面添加了这段话 enablePullDownRefresh false 全局关闭下拉刷新 这段话确实禁止了下拉刷新 无论是安卓手机端还是苹
  • 学习Python之路之Python中常见的数据结构一——列表

    列表 List 是Python语言中最通用的序列数据结构之一 列表是一个没有固定长度的 用来表示任意类型对象的位置相关的有序集合 列表的数据项不需要具有相同的类型 常用的列表操作主要包括 索引 连接 乘法和切片等 列表中的每个元素都分配一个
  • 线性dp-----最长公共上升子序列

    首先介绍一下什么是最长公共上升子序列 对于两个数列A B 如果他们都包含一段位置不一定连续的且数值是严格递增的 那么称这一段数就是两个数列的公共上升子序列 所有公共子序列中最长的就是最长公共子序列 例 A 1 7 3 2 4 B 7 2 1
  • 阿里云dataworks离线同步

    业务场景 用公网ip 从本地mysql数据库到另一个本地mysql数据库 在dataworks上配置离线同步和调度任务 步骤 阿里云登录 1 进入dataworks 2 进入控制台 3 选择数据开发 4 配置数据源 选择mysql数据源 连
  • cmd指令杀掉某个端口或线程

    第一步 点击起始菜单 或是通过win R快捷键 在输入框中输入cmd 点击确定 即可打开dos命令窗 第二步 输入netstat ano 查询所有端口 第三步 找到你想杀掉的端口对应的 PID 比如 上面的127 0 0 1 4369对应的
  • 为什么零基础选择语言首选python

    在众多编程语言中 似乎已经没有什么能够阻挡Python的步伐 本月Python又是第一名 市场份额达到了13 42 在2023年 Python已经连续7个月蝉联榜首 遥遥领先于其他对手 每个月榜单发布后 都有小伙伴会好奇 为什么又是Pyth
  • JWT实现登陆认证及Token自动续期

    技术选型 要实现认证功能 很容易就会想到JWT或者session 但是两者有啥区别 各自的优缺点 应该Pick谁 夺命三连 区别 基于session和基于JWT的方式的主要区别就是用户的状态保存的位置 session是保存在服务端的 而JW
  • 在央企当程序员是一种怎样的体验?

    来源 zhihu com question 276681361 answer 2134441878 大家好 又到了求职季 给大家分享一段一位朋友的央企工作经历 希望对于观望工作机会的小伙伴 有些参考 我校招加入了某垄断央企 在里面从事研发工
  • 解决VS2015生成Qt5的QMainWindows界面解决方案时产生一个“表达式必须包含指针类型”的问题

    解决VS2015生成Qt5的QMainWindows界面解决方案时产生一个 表达式必须包含指针类型 的问题 问题描述 分析过程 总结 问题描述 VS2015生成了一个QMainWindow界面 我在cpp实现文件使用ui这个表达式时出现下面
  • 单链表的合并【去重】

    2个有序单链表的合并 void Mergelist L LinkList LA LinkList LB LinkList LC pa LA gt next pb LB gt next LC LA LinkList pc LC while p
  • 智能仓储管理系统(自动化仓库管理解决方案)

    企业实际的仓储管理中 往往会出现那样这样的错误 归根结底 主要是由于没使用合适的仓库管理工具 相反 人工使用合适的仓库管理工具 不仅可以在日常仓库管理方法中根据采集到的产品信息数据 大大地提高管理效率 降低库存实际管控成本 还可降低人工管理
  • 【严重】Smartbi未授权设置Token回调地址获取管理员权限

    漏洞描述 Smartbi是一款商业智能应用 提供了数据集成 分析 可视化等功能 帮助用户理解和使用他们的数据进行决策 在 Smartbi 受影响版本中存在Token回调地址漏洞 未授权的攻击者可以通过向目标系统发送POST请求 smartb
  • 个人用记录:docker启动容器之后不久就会自动关闭

    原因是 docker容器运行必须有一个前台进程 如果没有前台进程执行 容器认为空闲 就会自行退出 尝试方案1 docker run dit name jenkins p 8080 8080 jenkinsci blueocean bin b
  • JS基础-Navigator-尚硅谷-P124

    视频链接 视频 代码
  • C语言之va_list

    va list va list 是在C语言中解决变参问题的一组宏 变参问题是指参数的个数不定 可以是传入一个参数也可以是多个 可变参数中的每个参数的类型可以不同 也可以相同 可变参数的每个参数并没有实际的名称与之相对应 用起来是很灵活 va
  • IT项目管理作业4

    分析与工具 你联合同学做一个年级微信公众号加强各班相互了解 联合活动等 请编制项目章程和项目管理计划 指导该项目实施与运营 必须包含 WBS 和 甘特图 召开一个项目策划研讨会 每个人用思维导图记录会议内容 该图必须满足 话题跟踪 热点标注
  • JVM(java 虚拟机)内存设置

    一 设置JVM内存设置 1 设置JVM内存的参数有四个 Xmx Java Heap最大值 默认值为物理内存的1 4 最佳设值应该视物理内存大小及计算机内其他内存开销而定 Xms Java Heap初始值 Server端JVM最好将 Xms和
  • 半导体制程发展史

    半导体制程发展史 大杀器级别文献 摘要 半导体制造的工艺节点 涉及到多方面的问题 如制造工艺和设备 晶体管的架构 材料等 分析半导体制造的工艺节点发展历程 其实就是在回顾半导体大咖的统治史 首先 技术节点 诸如台积电16nm工艺的Nvidi
  • 函数式编程-Stream流学习第二节-中间操作

    1 Stream流概述 java8使用的是函数式编程模式 如同它的名字一样 它可以用来对集合或者数组进行链状流式操作 让我们更方便的对集合或者数组进行操作 2 案例准备工作 我们首先创建2个类一个作家类 一个图书类 package com