Java Stream 的常用API

news2024/12/23 5:05:09

Java Stream 的常用API

遍历(forEach)

package com.liudashuai;

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

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",25));
        userList.add(new Person("萧峰",40));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("无涯子",100));
        userList.add(new Person("慕容复",35));
        userList.add(new Person("云中鹤",45));

        System.out.println(userList);
        System.out.println("---------------");

        userList.stream().forEach(u -> {
            u.setName("天龙八部-" + u.getName());
        });

        System.out.println(userList);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

筛选(filter)

package com.liudashuai;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",25));
        userList.add(new Person("萧峰",40));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("无涯子",100));
        userList.add(new Person("慕容复",35));
        userList.add(new Person("云中鹤",45));

        List<Person> collect =
                userList.stream().filter(user -> (user.getAge() > 30 && user.getName().length() >2)).collect(Collectors.toList());

        System.out.println(collect);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

查找(findAny/findFirst)

package com.liudashuai;

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

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",25));
        userList.add(new Person("萧峰",41));
        userList.add(new Person("萧峰",42));
        userList.add(new Person("萧峰",43));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("无涯子",100));
        userList.add(new Person("慕容复",35));
        userList.add(new Person("云中鹤",45));

        Person user = userList.stream().filter(u -> u.getName().equals("阿紫")).findAny().orElse(new Person("无",0));
        System.out.println(user);

        Person user1 = userList.stream().filter(u -> u.getName().equals("阿紫")).findAny().orElse(null);
        System.out.println(user1);

        Person user2 = userList.stream().filter(u -> u.getName().equals("萧峰")).findAny().orElse(null);
        System.out.println(user2);

        Person user3 = userList.stream().filter(u -> u.getName().equals("萧峰")).findFirst().orElse(null);
        System.out.println(user3);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

  1. findFirst() 方法根据命名,我们可以大致知道是获取Optional流中的第一个元素。
  2. findAny() 方法是获取Optional 流中任意一个,存在随机性,其实这里也是获取元素中的第一个,因为是并行流。

注意:在串行流中,findFirst和findAny返回同样的结果;但在并行流中,由于多个线程同时处理,findFirst可能会返回处理结果中的第一个元素,而findAny会返回最先处理完的元素。所以并行流里面使用findAny会更高效。这里并行下findFirst可能返回的不是第一个符合条件的元素吗?我不知道,但是,不重要,因为用得场景不多,因为多线程下,谁是处理结果中的第一个元素一般不重要,因为谁都可能是第一个,所以这里我不去了解findFirst是否可能返回的不是第一个符合条件的元素了。

总之就是串行流下,findFirst和findAny结果一样,并行流下,findAny效率更高,且并行流一般不在意谁是第一个,所以我建议平时使用findAny。

.orElse(null)表示如果一个都没找到返回null。

orElse()中可以塞默认值。如果找不到就会返回orElse中你自己设置的默认值。比如:上面的.orElse(new Person(“无”,0))

转换/去重(map/distinct)

package com.liudashuai;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",25));
        userList.add(new Person("萧峰",41));
        userList.add(new Person("萧峰",42));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("无涯子",100));
        userList.add(new Person("慕容复",35));
        userList.add(new Person("云中鹤",45));

        List<String> nameList = userList.stream().map(Person::getName).collect(Collectors.toList());
        System.out.println(nameList);
        List<String> nameList2 = userList.stream().map(Person::getName).distinct().collect(Collectors.toList());
        System.out.println(nameList2);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

map的作用:是将输入一种类型,转化为另一种类型,通俗来说:就是将输入类型变成另一个类型。

跳过(limit/skip)

package com.liudashuai;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",25));
        userList.add(new Person("萧峰",41));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("无涯子",100));
        userList.add(new Person("慕容复1",35));
        userList.add(new Person("慕容复2",35));
        userList.add(new Person("慕容复3",35));

        //跳过第一个
        List<Person> collect = userList.stream().skip(1).collect(Collectors.toList());
        System.out.println(collect);
        //只输出前两个元素
        List<Person> collect2 = userList.stream().limit(2).collect(Collectors.toList());
        System.out.println(collect2);
        //跳过前3个元素,然后输出3个元素。可以代替sql中的limit。
        List<Person> collect3 = userList.stream().skip(3).limit(3).collect(Collectors.toList());
        System.out.println(collect3);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

最大值/最小值/平均值(reduce)

package com.liudashuai;

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

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",25));
        userList.add(new Person("萧峰",41));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("无涯子",100));
        userList.add(new Person("慕容复",35));

        System.out.println("求和");
        Integer sum1 = userList.stream().map(Person::getAge).reduce(0, Integer::sum);
        System.out.println(sum1);

        int sum2 = userList.stream().mapToInt(Person::getAge).sum();
        System.out.println(sum2);

        Integer sum3 = userList.stream().collect(Collectors.summingInt(Person::getAge));
        System.out.println(sum3);

        System.out.println("最大值");
        Optional<Integer> max1 = userList.stream().map(Person::getAge).collect(Collectors.toList())
                .stream().reduce((v1, v2) -> v1 > v2 ? v1 : v2);
        System.out.println(max1.get());

        Optional<Integer> max2 = userList.stream().map(Person::getAge).collect(Collectors.toList())
                .stream().reduce(Integer::max);
        System.out.println(max2.get());

        int max3 = userList.stream().mapToInt(Person::getAge).max().getAsInt();
        System.out.println(max3);

        System.out.println("最小值");
        Optional<Integer> min = userList.stream().map(Person::getAge).collect(Collectors.toList())
                .stream().reduce(Integer::min);
        System.out.println(min.get());

        int min2 = userList.stream().mapToInt(Person::getAge).min().getAsInt();
        System.out.println(min2);

        System.out.println("平均值");
        Double averaging1 = userList.stream().collect(Collectors.averagingDouble(Person::getAge));
        System.out.println(averaging1);

        double averaging2 = userList.stream().mapToInt(Person::getAge).average().getAsDouble();
        System.out.println(averaging2);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

mapToInt是 Stream API中一个非常有用的方法。它的主要作用是将一个 Stream 转换成一个IntStream,使得可以更加方便地对数字流进行处理。

IntStream中的一些常用方法如下:

  1. sum()
  2. max()
  3. min()
  4. average()

这些方法上面案例里面也有演示。

如果要操作的元素不是int,是double,我们也可以用mapToDouble也行。

package com.liudashuai;

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

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",161.5));
        userList.add(new Person("萧峰",171.2));
        userList.add(new Person("虚竹",167.2));
        userList.add(new Person("无涯子",184.2));
        userList.add(new Person("慕容复",178.0));

        double sum = userList.stream().mapToDouble(Person::getHeight).sum();//和
        double max = userList.stream().mapToDouble(Person::getHeight).max().getAsDouble();//最高
        double min = userList.stream().mapToDouble(Person::getHeight).min().getAsDouble();//最矮
        double average = userList.stream().mapToDouble(Person::getHeight).average().getAsDouble();//平均
        System.out.println(sum);
        System.out.println(max);
        System.out.println(min);
        System.out.println(average);
    }
}
class Person{
    private String name;
    private double height;

    public Person(String name, double height) {
        this.name = name;
        this.height = height;
    }

    public String getName() {
        return name;
    }

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

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", height=" + height +
                '}';
    }
}

在这里插入图片描述

统计(count/counting)

package com.liudashuai;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("段誉",25));
        userList.add(new Person("萧峰",41));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("无涯子",100));
        userList.add(new Person("虚竹",30));
        userList.add(new Person("慕容复",35));

        Long collect = userList.stream().filter(p -> p.getName() == "虚竹").collect(Collectors.counting());
        System.out.println(collect);

        long count = userList.stream().filter(p -> p.getAge() >= 50).count();
        System.out.println(count);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

排序(sorted)

package com.liudashuai;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        List<Person> userList = new ArrayList<>();
        userList.add(new Person("1",25));
        userList.add(new Person("2",41));
        userList.add(new Person("33",30));
        userList.add(new Person("11",100));
        userList.add(new Person("55",30));
        userList.add(new Person("22",35));

        List<Person> collect =
                userList.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());
        System.out.println(collect);

        List<Person> collect2 =
                userList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
        System.out.println(collect2);

        List<Person> collect3 =
                userList.stream().sorted(Comparator.comparing(Person::getName)).collect(Collectors.toList());
        System.out.println(collect3);

        List<Person> collect4 = userList.stream().sorted((e1, e2) -> {
            return Integer.compare(Integer.parseInt(e1.getName()), Integer.parseInt(e2.getName()));
        }).collect(Collectors.toList());
        System.out.println(collect4);
    }
}
class Person{
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在这里插入图片描述

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

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

相关文章

银行支付凭证截图生成器在线,工商邮政农业招商建设,画板+透明标签+图片框

用易语言设计了一个非常牛X的截图生成器&#xff0c;娱乐使用哈&#xff0c;软件我在这里也不会分享&#xff0c;模版网上找的&#xff0c;百度图库搜到的&#xff0c;上面的LOGO用的是一个在线生成器&#xff0c;然后标签用的黑月透明标签&#xff0c;加一个通用对话框读取图片…

《QT从基础到进阶·二十一》QGraphicsView、QGraphicsScene和QGraphicsItem坐标关系和应用

前言&#xff1a; 我们需要先由一个 QGraphicsView&#xff0c;这个是UI显示的地方&#xff0c;也就是装满可见原色的Scene&#xff0c;然后需要一个QGraphicsScene 用来管理所有可见的界面元素&#xff0c;要实现UI功能&#xff0c;我们需要用各种从QGraphicsItem拼装成UI控件…

Python编程爬虫代码

这是一个基本的爬虫程序的示例&#xff0c;按照你的需求进行了修改&#xff1a; typescript import * as request from request; import * as cheerio from cheerio; const proxyHost ; const proxyPort ; // 创建一个request实例&#xff0c;使用 const requestWithProxy…

大数据系统建模方法论简谈

1.根据业务需求构建总线矩阵--明确需求 构建总线矩阵的目的&#xff1a;总线矩阵也是BI核心之一&#xff0c;基本上只要详细了解企业业务战略线就能得出总线矩阵&#xff0c;它对应着企业每一个业务单元&#xff0c;提取业务单元中的一致性维度和事实量值组 组合成企业总线矩阵…

从关键新闻和最新技术看AI行业发展(2023.10.23-11.5第九期) |【WeThinkIn老实人报】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&…

2023亚太杯数学建模B题思路解析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

程序运行前后内存分区存储

程序运行前是源码 在程序运行后&#xff0c;生成了exe可执行程序 分为代码区和全局区 代码区&#xff1a; 存放CPU执行的机器指令代码区是共享的&#xff0c;共享的目的是对于频繁被执行的程序&#xff0c;只需要在内存中有一份代码就可以了代码区是只读的&#xff0c;其只读…

BEVFusion简介、环境配置与安装以及遇到的各种报错处理

BEVFusion简介、环境配置与安装以及遇到的各种报错处理 BEVFusion简介BEVFusion环境配置与安装报错解决 BEVFusion简介 针对点云投射到图像的多模态融合和图像投射到点云的多模态融合&#xff0c;前者会损失空间几何信息&#xff0c;后者会损失图像语义信息&#xff0c;这两种…

janus 安装部署

本文使用docker进行安装&#xff0c;还没有安装docker和docker-compose的&#xff0c;请自行安装&#xff0c;这里就不介绍了 环境 janus-gateway镜像版本:anyan/janus-gateway:0.10.7 linux版本: Ubuntu 18.04.6 LTS coturn/coturn 镜像版本: coturn/coturn:latest 镜像ID 8…

java算法学习索引之动态规划

一 斐波那契数列问题的递归和动态规划 【题目】给定整数N&#xff0c;返回斐波那契数列的第N项。 补充问题 1&#xff1a;给定整数 N&#xff0c;代表台阶数&#xff0c;一次可以跨 2个或者 1个台阶&#xff0c;返回有多少种走法。 【举例】N3&#xff0c;可以三次都跨1个台…

【ARM Trace32(劳特巴赫) 使用介绍 4 - Trace32 Discovery 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 1.1 SYS.Detect1.2 AHBAPn/AXIAPnAPBAPn.Base1.1 SYS.Detect 在 TRACE32 中, SYS.Detect 是一个用来检测目标系统配置的命令。 当你执行 SYS.Detect DAP 命令时,TRACE32 将自动检测和识别目标系统上的 ARM De…

VScode不打开浏览器实时预览html

下载Microsoft官方的Live Preview就行了 点击预览按钮即可预览

前端---CSS的样式汇总

文章目录 CSS的样式元素的属性设置字体设置文字的粗细设置文字的颜色文本对齐文本修饰文本缩进行高设置背景背景的颜色背景的图片图片的属性平铺位置大小 圆角矩形 元素的显示模式行内元素和块级元素的转化弹性布局水平方向排列方式&#xff1a;justify-content垂直方向排序方式…

GoldWave 6.78中文免费激活版功能特色2024最新功能解析

GoldWave 6.78中文免费激活版是一款多功能、强大且用户友好的音频编辑工具。它为音乐制作人、播客主持人以及音频编辑爱好者提供了全面的编辑功能&#xff0c;让你能够创造出高质量的音频作品。无论你是在音乐制作、音频修复还是播客制作&#xff0c;GoldWave 都是一个值得一试…

【Python3】【力扣题】263. 丑数

【力扣题】题目描述&#xff1a; 此题&#xff1a;正整数n&#xff0c;能被2或3或5整除&#xff0c;且不断除以2或3或5最终的数是1。 【Python3】代码&#xff1a; 1、解题思路&#xff1a;递归。 知识点&#xff1a;递归&#xff1a;函数中调用函数自身&#xff08;必须有退…

Metric

如果 Metric ‘use_polarity&#xff08;使用极性&#xff09;’ &#xff0c;则图像中的对象必须和模型具有相同的对比度&#xff08;Contrast&#xff09;。比如&#xff0c;如果模型是一个在暗/深色背景上的明亮物体&#xff0c;则仅当对象比背景更亮时才会被找到。 如果 …

Python 使用tkinter复刻Windows记事本UI和菜单功能(二)

上一篇&#xff1a;Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器&#xff08;一&#xff09;-CSDN博客 下一篇&#xff1a;敬请耐心等待&#xff0c;如发现BUG以及建议&#xff0c;请在评论区发表&#xff0c;谢谢&#xff01; 相对上一篇文章&#xff0c;本篇文…

arcgis提取栅格有效边界

方法一&#xff1a;【3D Analyst工具】-【转换】-【由栅格转出】-【栅格范围】 打开一幅栅格数据&#xff0c;利用【栅格范围】工具提取其有效边界&#xff08;不包含NoData值&#xff09;&#xff1a; 方法二&#xff1a;先利用【栅格计算器】将有效值赋值为1&#xff0c;得到…

vue项目路由使用history模式,nginx配置,刷新页面显示404

需要在配置项中添加 try_files $uri $uri/ /index.html;