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

news2024/9/22 7:33:37

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 VMware软件是一种虚拟化软件&#xff0c;可以将一台计算机分成多个虚拟机&#xff0c;每个虚拟机都可以运行独立的操作系统和应用程序&#xff0c;从而实现多个不同的工作环境共用同一台硬件设备。以下是关于VMware软件的详细介…

38、springboot为 spring mvc 提供的静态资源管理,覆盖和添加静态资源目录

springboot为 spring mvc 提供的静态资源管理 ★ Spring Boot为Spring MVC提供了默认的静态资源管理&#xff1a; ▲ 默认的四个静态资源目录&#xff1a; /META-INF/resources > /resources > /static > /public ▲ ResourceProperties.java类的源代码&#xff0…

Java进阶篇--进程和线程的区别

进程和线程 进程 在一个操作系统中&#xff0c;每个独立执行的程序都可称之为一个进程&#xff0c;也就是“正在运行的程序”。目前大部分计算机上安装的都是多任务操作系统&#xff0c;即能够同时执行多个应用程序&#xff0c;最常见的有Windows、Linux、Unix等。比如在Wind…

最新社会工程学技术

人本身是防御体系中最大的漏洞。由于人心的不可测性&#xff0c;决定了无法像修补漏洞一样对人打补丁&#xff0c;只能通过后天培养安全意识来预防这种情况发生。虽然社会工程学的本质是心理战术&#xff0c;但是可以使用很多技术手段进行辅助&#xff0c;本节介绍社会工程学常…

REDIS 7 教程 数据类型-进阶篇

⑥ *位图 bitmap 1. 理论 由0和1 状态表现的二进制位的bit 数组。 说明:用String 类型作为底层数据结构实现的一种统计二值状态的数据类型 位图本质是数组,它是基于String 数据类型的按位操作。该数组由多个二进制位组成,每个二进制位都对应一个偏…

合并两个链表

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 比如以下例子&#xff1a; 题目接口&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListN…

nodejs+vue+elementui农业产品信息网上商城管理系统_9927h

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端nodejsvueelementui,系统使用权限分别包括管理员、种植户和用户&#xff0c;其中管理员拥有着最大的权限&#xff0c;同时管理员的…

C++初学者学习指南

文章目录 环境职业选择基本技能新特性与学习曲线高阶技能C模版元编程线程池&#xff0c;异步任务 C 相关工具及资源C ToolsC Resources 项目大项目小项目 如何学未来期望 环境 编程工具&#xff1a;VSCode插件&#xff1a; BazelC/CClang-FormatVim 职业选择 AI领域&#xf…

大学英语赛道情报分析——全国大学生英语竞赛

竞赛简介 竞赛简介更多>全国大学生英语竞赛每年一届&#xff0c;自1999年创办以来至今已连续举办二十三届&#xff0c;得到了各省、自治区、直辖市大学外语教学研究会和各高校师生的大力支持&#xff0c;每年全国共有31个省&#xff08;自治区、直辖市&#xff09;的一千二百…

设计模式之工厂模式(万字长文)

文章目录 概述工厂模式的优点包括工厂模式有几种主要的变体看一个具体需求使用传统的方式来完成传统的方式的优缺点 简单工厂模式基本介绍使用简单工厂模式简单工厂模式的优缺点优点&#xff1a;缺点&#xff1a; 工厂方法模式看一个新的需求思路 1思路 2工厂方法模式介绍工厂方…

安达发|关于MES制造执行系统成功实施的经验分享

智能制造”热潮席卷神州大地&#xff0c;在国家的大力推进下&#xff0c;建设智能工厂&#xff0c;推进智能制造已成为制造企业共同的目标。作为承上启下的车间级综合信息系统&#xff0c;MES系统得到了制造企业的广泛关注&#xff0c;市场变得异常火热。 但是&#xff0c;MES系…

解决IndexError: index 0 is out of bounds for axis 1 with size 0

标题 引言问题背景解决思路如何防止总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d;…

mysql 查询的字段值太长显示不全 group_concat

当前这个字段非常的长&#xff0c;在数据库看的时候也只是显示一部分内容&#xff0c;这是由于group_concat的group_concat_max_len参数的值太小造成的&#xff0c;默认值如下&#xff1a; show VARIABLES like group_concat_max_len 我们需要将这个值调大一点就可以解决上面这…

如何搭建智能家居系统并通过内网穿透实现远程控制家中设备

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 前言 Home Assistant&…

(纯c)数据结构之------>链表(详解)

目录 一. 链表的定义 1.链表的结构. 2.为啥要存在链表及链表的优势. 二. 无头单向链表的常用接口 1.头插\尾插 2.头删\尾删 3.销毁链表/打印链表 4.在pos位置后插入一个值 5.消除pos位置后的值 6.查找链表中的值并且返回它的地址 7.创建一个动态开辟的结点 三.顺序表与链表…

VAE原理 代码详解 pin_memory

VAE代码 import torch from torch import nn import torch.nn.functional as F class VAE(nn.Module):def __init__(self, input_dim784, h_dim400, z_dim20): # 28x28784,20可能是这个手写体一共有20类&#xff1f;super(VAE, self).__init__()self.input_dim input_dimsel…

【Hadoop】HDFS读写流程和客户端命令使用

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

XSS攻击与防御

目录 一、环境配置 kali安装beef contos7安装dvwa 二、XSS攻击简介 三、XSS攻击的危害 四、xSS攻击的分类 五、XSS产生的原因 六、构造XSS攻击脚本 (一)基础知识 常用的html标签 常用的js脚本 (二)构造脚本的方式弹窗警告 七、自动XSS攻击 (一)BeEF简介 (二)BeEF…

Python 阿里云盾滑块验证

&#xfeff;<table><tr><td bgcolororange>本文仅供学习交流使用&#xff0c;如侵立删&#xff01;</td></tr></table> 记一次阿里云盾滑块验证分析并通过 操作环境 win10 、 macPython3.9selenium、pyautogui 分析 最近在做中国庭审…

SQLI-labs-第一关

知识点&#xff1a;单引号字符型注入 思路&#xff1a; 1、根据提示&#xff0c;为get注入&#xff0c;在url中输入内容 2、判断注入点 输入?id1&#xff0c;显示数据库语句错误&#xff0c;说明这里存在sql注入漏洞 输入?id1‘ and 11 -- &#xff0c;回显正常&#xff0c…