Java8之Stream操作

Java8之Stream操作

  • stream干啥用的?
  • 创建流
  • 中间操作
  • 终结操作
  • 好文推荐----接口优化思想

stream干啥用的?

Stream 就是操作数据用的。使用起来很方便
创建流 → 中间操作 → 终结操作

在这里插入图片描述

Stream的操作可以分为两大类:中间操作、终结操作

中间操作可分为:

  1. 无状态(Stateless)操作:指元素的处理不受之前元素的影响
  2. 有状态(Stateful)操作:指该操作只有拿到所有元素之后才能继续下去

终结操作可分为:

  1. 短路(Short-circuiting)操作:指遇到某些符合条件的元素就可以得到最终结果
  2. 非短路(Unshort-circuiting)操作:指必须处理完所有元素才能得到最终结果

创建流

  1. 单列集合
    通过 .stream() 方法即可。
   // 例如:
   List<Person> personList = new ArrayList<>();
   // 创建流
   Stream pstream = personList.stream();
  1. 双列集合
    转成单列集合再创建流
	//例如:
    Map<String,Integer> map = new HashMap<>();
    map.entrySet()  //转成与List一样的单列集合,只是取值不一样。
       .stream()  

中间操作

  1. filter 过滤
		List<Person> personList = new ArrayList<>();
        personList.add(new Person(10,"flx"));
        personList.add(new Person(11,"flx"));
        personList.add(new Person(12,"cxy"));
        personList.add(new Person(13,"cxy"));
        personList.add(new Person(10,"flx"));


        //filter操作----过滤。比如过滤出年龄大于10的人。
        personList.stream()
                  .filter(person -> person.age>10)
                  .forEach(person -> System.out.println(person.getName()));
  1. map 对整体流的操作
        //最常用的操作是取某一些值
        personList.stream()
                .map(person -> person.getName())
                .forEach(name -> System.out.println(name));
                
        // 计算的话,一般用不到
        personList.stream()
                  .map(person -> person.age = person.age+10)
                  .forEach(person -> System.out.println(person));
  1. flatMap 扁平化List。重点是扁平化对象中有List的数据,且要返回流数据
        Friend friend1 = new Friend("张三");
        Friend friend2 = new Friend("李四");
        Friend friend3 = new Friend("王五");
        List<Friend> friends = new ArrayList<>();
        friends.add(friend1);
        friends.add(friend2);
        friends.add(friend3);

        List<Person> personList2 = new ArrayList<>();
        personList2.add(new Person(10,"flx",friends));
        personList2.add(new Person(11,"cxy",friends));

        personList2.stream()
                   .flatMap(person -> person.getFriendList().stream())
                   .forEach(friend -> System.out.println(friend.getName()));
  1. distinct 去重。重点是需要重写对象中equals()方法
        // distinct操作----去重。
        personList.stream()
                  .distinct()
                  .forEach(person -> System.out.println(person.getName()));
  1. sorted 排序。重点是对象需要实现Comparable接口
        // sorted操作----排序。
        personList.stream()
                  .sorted()
                  .forEach(person -> System.out.println(person.getAge()));
  1. limitskip。limit是截取前n个元素。skip是跳过前n个,剩下的截取
        // limit操作----截取。
        personList.stream()
                  .limit(2)
                  .forEach(person -> System.out.println(person.getAge()));



        // skip操作----跳过并截取
        personList.stream()
                .skip(2)
                .forEach(person -> System.out.println(person.getAge()));

终结操作

  1. collect 转成集合
  2. forEach 遍历
  3. countmaxmin 统计、最大、最小
        long count = personList.stream()
                .flatMap(person -> person.getFriendList().stream())
                .count();
        System.out.println(count);


        Optional<Integer> max = personList.stream()
                .map(person -> person.getAge())
                .max((o1,o2) -> o1-o2);
        System.out.println(max.get());
  1. anyMatchallMatch
        // anyMatch 只要有一个匹配,就返回true
        // allMatch 所有都匹配,才返回true
                Boolean b = personList.stream()
                  .anyMatch(person -> person.getAge()>10);
        System.out.println(b);

  1. findAnyfindFirst
        // findAny 查找任意一个满足条件的元素
        // findFirst 查找满足条件元素的第一个
        Optional<Person> first = personList.stream()
                .filter(person -> person.getAge() > 10)
                .findFirst();

        first.ifPresent(person -> System.out.println(person.getName()));
  1. reduce 一般会先map一下,再执行reduce ( 我们熟悉的mapReduce()操作 )
        // reduce(params1,params2)
        // params1:初始化的第一个值
        // params2: 要执行的操作。
            // 里面有两个参数  result、element
            // result 每一步返回的结果
            // element 当前的元素


        // 例如,计算所有的年龄的和
        Integer reduce = personList.stream()
                .map(person -> person.getAge())
                .reduce(0, (result, element) -> result = result + element);
        System.out.println(reduce);

中间操作常用的是 filter、map、flatmap
终结操作常用的是foreach、collect、reduce

整体代码示例

package com.face;

import lombok.val;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@SpringBootTest
class FaceEasyApplicationTests {

    @Test
    void contextLoads() {
    }

    /*
    * 中间操作
    * */
    @Test
    void testStreamMiddle() {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(10,"flx"));
        personList.add(new Person(11,"flx"));
        personList.add(new Person(12,"cxy"));
        personList.add(new Person(13,"cxy"));
        personList.add(new Person(10,"flx"));


        //filter操作----过滤。比如过滤出年龄大于10的人。
        personList.stream()
                  .filter(person -> person.age>10)
                  .forEach(person -> System.out.println(person.getName()));



        //map操作----对整体流中数据的计算或者转换。比如给所有作家+10岁
        //常用的操作是取某一些值
        personList.stream()
                .map(person -> person.getName())
                .forEach(name -> System.out.println(name));
        // 计算的话,一般用不到
        personList.stream()
                  .map(person -> person.age = person.age+10)
                  .forEach(person -> System.out.println(person));



        // distinct操作----去重。重点是重写equals方法。
        personList.stream()
                  .distinct()
                  .forEach(person -> System.out.println(person.getName()));




        // sorted操作----排序。
        personList.stream()
                  .sorted()
                  .forEach(person -> System.out.println(person.getAge()));



        // limit操作----截取。例如截取前两个。可以结合排序使用,比如排序后,截取元素
        personList.stream()
                  .limit(2)
                  .forEach(person -> System.out.println(person.getAge()));



        // skip操作----跳过。跳过前n个元素,返回剩下的。可以结合排序使用,比如排序后,跳过某些元素,返回剩下的
        personList.stream()
                .skip(2)
                .forEach(person -> System.out.println(person.getAge()));



        // flatMap操作----扁平化处理。扁平化对象中的List,并且把她们作为流返回
        Friend friend1 = new Friend("张三");
        Friend friend2 = new Friend("李四");
        Friend friend3 = new Friend("王五");
        List<Friend> friends = new ArrayList<>();
        friends.add(friend1);
        friends.add(friend2);
        friends.add(friend3);

        List<Person> personList2 = new ArrayList<>();
        personList2.add(new Person(10,"flx",friends));
        personList2.add(new Person(11,"cxy",friends));

        personList2.stream()
                   .flatMap(person -> person.getFriendList().stream())
                   .forEach(friend -> System.out.println(friend.getName()));

    }




    /*
    * 终结操作
    * */
    @Test
    void testStreamFinish() {
        Friend friend1 = new Friend("张三");
        Friend friend2 = new Friend("李四");
        Friend friend3 = new Friend("王五");
        List<Friend> friends = new ArrayList<>();
        friends.add(friend1);
        friends.add(friend2);
        friends.add(friend3);

        List<Person> personList = new ArrayList<>();
        personList.add(new Person(10,"flx",friends));
        personList.add(new Person(11,"cxy",friends));

        // forEach
        personList.stream()
                  .map(person -> person.getName())
                  .forEach(name -> System.out.println(name));


        // count操作----统计数量。例如统计personList中,所有朋友的数量
        long count = personList.stream()
                .flatMap(person -> person.getFriendList().stream())
                .count();
        System.out.println(count);


        // max和min操作----取最大值与最小值。例如取personList中年龄的最大值与最小值
        Optional<Integer> max = personList.stream()
                .map(person -> person.getAge())
                .max((o1,o2) -> o1-o2);
        System.out.println(max.get());


        // collect操作----转换成集合。


        // anyMatch 、allMatch 、findAny、findFirst操作----见名知意,就是匹配操作与查找操作
        // anyMatch 只要有一个匹配,就返回true
        // allMatch 所有都匹配,才返回true

        // findAny 查找任意一个满足条件的元素
        // findFirst 查找满足条件元素的第一个
        Boolean b = personList.stream()
                  .anyMatch(person -> person.getAge()>10);
        System.out.println(b);


        // 查找年龄大于10的第一个元素
        Optional<Person> first = personList.stream()
                .filter(person -> person.getAge() > 10)
                .findFirst();

        first.ifPresent(person -> System.out.println(person.getName()));



        //reduce操作----归并。一般会先map一下,再执行reduce ( 我们熟悉的mapReduce()操作 )
        // reduce(params1,params2)
        // params1:初始化的第一个值
        // params2: 要执行的操作。
            // 里面有两个参数  result、element
            // result 每一步返回的结果
            // element 当前的元素


        // 例如,计算所有的年龄的和
        Integer reduce = personList.stream()
                .map(person -> person.getAge())
                .reduce(0, (result, element) -> result = result + element);
        System.out.println(reduce);




    }

}


class Person implements Comparable<Person>{

    public int age;
    public String name;
    List<Friend> friendList;



    public List<Friend> getFriendList() {
        return friendList;
    }

    public void setFriendList(List<Friend> friendList) {
        this.friendList = friendList;
    }


    public Person(int age, String name, List<Friend> friendList) {
        this.age = age;
        this.name = name;
        this.friendList = friendList;
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (age != person.age) return false;
        return name != null ? name.equals(person.name) : person.name == null;
    }

    @Override
    public int hashCode() {
        int result = age;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }


    @Override
    public int compareTo(Person person) {
        return this.getAge() - person.getAge();
    }
}

class Friend{

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Friend(String name) {
        this.name = name;
    }

    String name;

}

好文推荐----接口优化思想

https://mp.weixin.qq.com/s/oeHLLvmKuq3zOQcRhSs8gw

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端自学好还是培训好?女生有多适合学前端,我来告诉你!

2023年了&#xff0c;你是否还在迷茫或者每个月拿着5/6k做着卷死的工作&#xff0c;不但存不下钱还不能好好享受生活&#xff0c;如果是&#xff0c;那你真该考虑一下转行了。 好程序员先说说前端到底怎么开始学&#xff1a; 有的伙伴说今年28岁了&#xff0c;学的会计&#xf…

Java --- redis7之布隆过滤器BloomFilter

目录 一、布隆过滤器BloomFilter 1.1、面试题 1.2、 布隆过滤器简介 1.2.1、设计思想 1.3、特点 1.4、布隆过滤器原理 1.4.1、实现原理与数据结构 1.4.2、添加key、查询key 1.4.3、hash冲突导致数据不精准 1.4.4、三步骤 1.4.5、布隆过滤器误判&#xff0c;为什么不…

xormplus是xorm的增强版,为xorm提供类似ibatis的配置文件及动态SQL支持

简介 xorm是一个简单而强大的Go语言ORM库&#xff0c;通过它可以使数据库操作非常简便。本库是基于原版xorm的定制增强版本&#xff0c;为xorm提供类似ibatis的配置文件及动态SQL支持&#xff0c;支持AcitveRecord操作。 github地址:https://github.com/armingli/xorm //安装…

FE_Vue学习笔记 条件渲染[v-show v-if] 列表渲染[v-for] 列表过滤 列表排序

1 条件渲染 v-show v-if 使用template可以使其里面的内容在html的结构中不变。条件渲染&#xff1a; v-if 1&#xff09;v-if“表达式” 2&#xff09;v-else-if“表达式” 3&#xff09;v-else {} 适用于&#xff1a;切换频率较低的场景。特点&#xff1a;不展示的DOM元素直…

( 位运算 ) 231. 2 的幂 / 342. 4的幂 ——【Leetcode每日一题】

❓题目一 231. 2 的幂 难度&#xff1a;简单 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2 x n 2^x n2x &#xff0c;则认为 n 是 2 的幂次方。 …

智慧档案馆建设之八防十防常用的设备

档案八防十防常用的十款设备 序号 名称 1 温湿度传感器 2 空气质量云测仪 3 恒湿净化一体机 4 健康防护一体机 5 综合智能触摸一体化区域控制器 6 空调红外学习控制模块 7 漏水检测控制器及感应线 8 数字烟雾传感器 9 红外防盗传感器 10 系统软件平台 附…

连接器:一种可靠耐用、节约成本的同为科技(TOWE)工业连接器

随着我国经济建设水平的飞速发展&#xff0c;工业连接器被广泛应用于工业、化工、机场、船舶、码头、建筑、铁路、医疗、会展、商业演出等领域。工业连接器的作用是用于连接一个电路导体与另一个电路导体、或一个传输元件与另一个传输元件的装置&#xff0c;并且为两个电路子系…

涅槃重生,BitKeep如何闯出千万用户新起点

在全球&#xff0c;BitKeep钱包现在已经有超过千万用户在使用。 当我得知这个数据的时候&#xff0c;有些惊讶&#xff0c;也有点意料之中。关注BitKeep这几年&#xff0c;真心看得出这家公司的发展之迅速。还记得2018年他们推出第一个版本时&#xff0c;小而美&#xff0c;简洁…

Java每日一练(20230513) 输出最值、盛水容器、旋转数组II

目录 1. 输出最值 ※ 2. 盛最多水的容器 &#x1f31f;&#x1f31f; 3. 搜索旋转排序数组 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 输出最值…

阿里云备案服务码是什么?备案服务码申请及限制说明

阿里云备案服务码是什么&#xff1f;ICP备案服务码怎么获取&#xff1f;阿里云备案服务码分为免费和付费两种&#xff0c;申请备案服务码是有限制条件的&#xff0c;需要你的阿里云账号下有可用于申请备案服务码的云产品&#xff0c;如云服务器、建站产品、虚拟主机等&#xff…

LDAP配置与安装

LDAP配置与安装 一、安装LDAP1、安装OpenLDAP及相关依赖包2、查看OpenLDAP版本3、配置OpenLDAP数据库4、设置OpenLDAP的管理员密码5、修改配置文件5.1. 修改{2}hdb.ldif文件5.2. 修改{1}monitor.ldif文件5.3. 修改{-1}frontend.ldif文件 6、验证LDAP的基本配置7、修改LDAP文件权…

如何解决人力资本管理挑战?

人力资本管理&#xff08;HCM&#xff09;是任何企业成功的一个重要因素。得益于高效、多产和敬业的员工队伍&#xff0c;在此领域找到正确的方法和策略可以推动您取得更大的成果。 但是&#xff0c;除了关注HCM的好处和机会之外&#xff0c;你还需要做好准备&#xff0c;以克…

【Linux】volatile | SIGCHLD | 多线程概念

文章目录 1. volatile编译器优化 2.SIGCHLD信号验证SIGCHLD的存在 3. 多线程多线程概念理解概念什么是多线程调度成本低局部性原理 什么叫做进程 1. volatile 在vscode中&#xff0c;创建signal.c文件 故意在while中没有写代码块&#xff0c;让编译器认为在main中&#xff0c;…

Mac上如何装Nacos?

Nacos大家都很熟悉,服务注册中心,那么今天给大家写一篇Mac上如何装Nacos的文章。 安装步骤如下: 1、上官网 http://nacos.io/zh-cn/ 点击跳到nacos的官网上。然后点击前往Github 2、找到release 发布版本 来到GitHub上后,页面往下滑,找到latest stable release,点击…

谷歌慌了!想发论文得审批,优先开发产品,让OpenAI没得看

来源 | 机器之心 ID | almosthuman2014 众所周知&#xff0c;谷歌就像人工智能领域的「黄埔军校」&#xff0c;自深度学习兴起后培养出了整整一代机器学习研究人员和工程师。很长一段时间里&#xff0c;谷歌就是领先 AI 技术的代名词。 人们已经习惯跟随谷歌的脚步&#xff0c…

2023 年第八届数维杯大学生数学建模挑战赛 B 题详细思路 节能列车运行控制优化策略

一种可能的建模方法是基于列车的动力学方程和阻力方程&#xff0c;将列车视为单质点&#xff0c;忽略车厢间的车钩力和速度差。根据给定的参数&#xff0c;可以建立如下的方程&#xff1a; $$m(p1)\frac{dv}{dt}F-f(v)-g(i)$$ $$f(v)2.08950.0098v0.006v^2$$ $$g(i)mgi$$ 其…

酒精和肠内外健康:有帮助还是有害?

谷禾健康 酒精与健康 饮酒作为一种特殊的文化形式&#xff0c;在我们国家有其独特的地位&#xff0c;在几千年的发展中&#xff0c;酒几乎渗透到日常生活、社会经济、文化活动之中。 据2018年发表的《中国饮酒人群适量饮酒状况》白皮书数据显示&#xff0c;中国饮酒人群高达6亿…

NFTScan: 蓝筹 NFT 跌幅严重,如何保持竞争力?

最近的市场大跌影响了 NFT 二级市场&#xff0c;市场情绪冷淡下跌严重&#xff0c;交易量和买家骤然下降&#xff0c;而蓝筹作为市场里的中流砥柱也表现不佳。以 BoerdApeYachtClub 为首的等主流 NFT 价格下跌超过 20%。此外&#xff0c;随着 PFP 的热潮已经过去&#xff0c;市…

外网SSH远程连接linux服务器,看这一篇就够了

文章目录 视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 转载自内网穿透工具的文章&#xff1a;无公网IP&#xff0c;SSH远程连接Linux CentOS服务器【内网穿透】 本次教程我们来实现如何在外公网环境下…

你真的理解分布式数据的分区吗?

分布式数据存储是指将数据分散存储在多个节点或服务器上的技术。而分区是将数据划分为逻辑上的片段或部分&#xff0c;每个分区可以在分布式系统中的不同节点上存储。分区主要是为了可扩展性。不同的分区可以放在不共享集群中的不同节点上&#xff0c;可以帮助实现负载均衡、高…