(三)流的终止操作

news/2024/12/6 19:59:07/

终止操作

流方法含义
anyMatch检查是否至少匹配一个元素,返回boolean。
allMatch检查是否匹配所有元素,返回boolean。
noneMatch检查是否没有匹配所有元素,返回boolean。
findAny将返回当前流中的任意元素。
findFirst返回第一个元素
forEach遍历流
collect收集器,将流转换为其他形式。
reduce可以将流中元素反复结合起来,得到一个值。
max/min/count返回流中元素最大/最小/总数。
1. 收集(collect)

1.1归集(toList/toSet/toMap)

转化成新的List
List<> new = old.stream().collect(Collectors.toList());转化成Map
Map<T,E> new= old.stream().collect(Collectors.toMap(T,E));转换成set集合
Set<> new =old.stream().Collectors.toSet();转换成特定的set集合
TreeSet<> new =old.stream().Collectors.toCollection(TreeSet::new);

转化成新的List

原始data:
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 18));
userList.add(new User(2, "李四", 19));
userList.add(new User(3, "王五", 20));//user的id提取出来
List<User> users = userList;
List<Integer> idList = users.stream().map(User::getId).collect(Collectors.toList());
//{1, 2, 3}
System.out.println(idList);

转化成Map

/1.两个参数的用法
//将userList转化为key为id,value为User对象的map
Map<Integer, User> map1 = userList.stream().collect(Collectors.toMap(User::getId, p -> p));
Map<Integer, User> map2 = userList.stream().collect(Collectors.toMap(User::getId, p -> p));//结果
{1: User(1, "张三", 18)2: User(2, "李四", 19)3: User(3, "王五", 20)
}//2.三个参数的用法
Map<Integer, String> map3 = userList.stream().collect(Collectors.toMap(User::getAge, User::getName, (a, b) -> b));//结果
{19: "李四"20: "王五"
}//Collectors.groupingBy()
//当你想获取key是age的map,又不想覆盖掉重复项数据
Map<Integer, List<User>> map4 = userList.stream().collect(Collectors.groupingBy(User::getAge));
System.out.println(map4);//结果
{18: [User(1, "张三", 18)]19: [User(2, "李四", 19)]20: [User(2, "王五", 20)]
}

1.2 统计(count/averaging)

Collectors提供了一系列用于数据统计的静态方法:

  • 计数:count
  • 平均值:averagingInt、averagingLong、averagingDouble
  • 最值:maxBy、minBy
  • 求和:summingInt、summingLong、summingDouble
  • 统计以上所有:summarizingInt、summarizingLong、summarizingDouble
public static void main(String[] args) {List<Person> personList = new ArrayList<Person>();personList.add(new Person(1, "zhangsan", 18, 4000, "shanghai"));personList.add(new Person(2, "lisi", 19, 5000, "beijing"));personList.add(new Person(3, "wanger", 20, 6000, "guangdong"));personList.add(new Person(4, "mazi", 21, 7000, "jiangxi"));personList.add(new Person(5, "laoer", 22, 8000, "zhejiang"));// 求总数Long count = personList.stream().collect(Collectors.counting());// 求平均工资Double average = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));// 求最高工资Optional<Integer> max = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));// 求工资之和Integer sum = personList.stream().collect(Collectors.summingInt(Person::getSalary));// 一次性统计所有信息DoubleSummaryStatistics collect = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));System.out.println("员工总数:" + count);System.out.println("员工平均工资:" + average);System.out.println("员工工资总和:" + sum);System.out.println("员工工资所有统计:" + collect);}//结果
员工总数:5
员工平均工资:6000.0
员工工资总和:30000
员工工资所有统计:DoubleSummaryStatistics{count=5, sum=30000.000000, min=4000.000000, average=6000.000000, max=8000.000000}

1.3 归约(reducing)
Collectors类提供的reducing方法,相比于stream本身的reduce方法,增加了对自定义归约的支持。

public static void main(String[] args) {List<Person> personList = new ArrayList<Person>();personList.add(new Person(1, "zhangsan", 18, 4000, "shanghai", "男"));personList.add(new Person(2, "lisi", 19, 5000, "beijing", "女"));personList.add(new Person(3, "wanger", 20, 6000, "guangdong", "男"));personList.add(new Person(4, "mazi", 21, 7000, "jiangxi", "男"));personList.add(new Person(5, "laoer", 22, 8000, "zhejiang", "女"));Integer allAge = personList.stream().map(Person::getAge).collect(Collectors.reducing(Integer::sum)).get();System.out.println(allAge);
}  //结果
100

1.4 接合(joining)
joining可以将 stream 中的元素用特定的连接符(没有的话,则直接连接)连接成一个字符串。

public static void main(String[] args) {List<Person> personList = new ArrayList<Person>();personList.add(new Person(1, "zhangsan", 18, 4000, "shanghai", "男"));personList.add(new Person(2, "lisi", 19, 5000, "beijing", "女"));personList.add(new Person(3, "wanger", 20, 6000, "guangdong", "男"));personList.add(new Person(4, "mazi", 21, 7000, "jiangxi", "男"));personList.add(new Person(5, "laoer", 22, 8000, "zhejiang", "女"));String names = personList.stream().map(t -> t.getName()).collect(Collectors.joining(","));System.out.println("所有员工的姓名:" + names);List<String> list = Arrays.asList("A", "B", "C");String string = list.stream().collect(Collectors.joining("&"));System.out.println("拼接后的字符串:" + string);}//结果
所有员工的姓名:zhangsan,lisi,wanger,mazi,laoer
拼接后的字符串:A&B&C

1.5 归约(reduce)
归约,也称缩减,顾名思义,是把一个流缩减成一个值,能实现对集合求和、求乘积和求最值操作。

/求和,求积
public static void main(String[] args) {List<Integer> list = Arrays.asList(1, 2, 3, 4, 7, 9);Optional<Integer> sum = list.stream().reduce((x, y) -> x + y);Optional<Integer> sum1 = list.stream().reduce(Integer::sum);Integer sum2 = list.stream().reduce(0, Integer::sum);Optional<Integer> product = list.stream().reduce((x, y) -> x * y);// 最大值方式1Optional<Integer> max = list.stream().reduce((x, y) -> x > y ? x : y);// 最大值方式2Integer max1 = list.stream().reduce(1, Integer::max);System.out.println("求和:" + sum.get() + "," + sum1.get() + "," + sum2);System.out.println("求积:" + product.get());System.out.println("求和:" + max.get() + "," + max1);
}//结果
求和:26,26,26
求积:1512
求和:9,9

1.6 聚合(max/min/count)
Collectors提供了一系列用于数据统计的静态方法:

计数:count平均值:averagingInt、averagingLong、averagingDouble最值:maxBy、minBy求和:summingInt、summingLong、summingDouble统计以上所有:summarizingInt、summarizingLong、summarizingDouble

//获取最长元素
public static void main(String[] args) {List<String> list = Arrays.asList("asdas", "asdasdasd", "sdasd", "fdfdf", "qqe");Optional<String> max = list.stream().max(Comparator.comparing(String::length));System.out.println("最长的字符串:" + max.get());
}//结果
最长的字符串:asdasdasd

1.7 匹配(find/match)

//匹配示例
public static void main(String[] args) {List<String> strings = Arrays.asList("123", "456", "abc", "sdf", "qwe", "qw2", "qwe");//anyMatch  判断集合中是否至少存在一个元素满足条件boolean a = strings.stream().anyMatch("123"::equals);System.out.println(a);//allMatch 判断集合中是否所有元素都满足条件boolean b = strings.stream().allMatch("123"::equals);System.out.println(b);//noneMatch 判断集合中是否所有元素都不满足条件boolean c = strings.stream().noneMatch("123"::equals);System.out.println(c);//findAny 返回当前流中任意元素Optional<String> any = strings.stream().findAny();any.ifPresent(System.out::println);//findFirst 返回当前流中第一个元素Optional<String> first = strings.stream().findFirst();first.ifPresent(System.out::println);
}//结果
true
false
false
123
123

http://www.ppmy.cn/news/54283.html

相关文章

MySQL表的插入详解

文章目录 前言一、插入完整数据记录二、插入部分数据记录三、插入多条数据记录总结 前言 插入数据记录是常见的数据操作&#xff0c;可以显示向表中增加的新的数据记录。在MySQL中可以通过“INSERT INTO”语句来实现插入数据记录&#xff0c;该SQL语句可以通过如下4种方式使用…

ext-1:PDK工具包编译出例程

1、TI的单独StarterWare不更新后&#xff0c;后续维护和更新的是 PROCESSOR-SDK-AM335X 软件开发套件 &#xff08;PDK&#xff09;&#xff0c;对比以前的&#xff0c;里面没有例程&#xff0c;所以下载安装完需要自己编译出example例程。 因为编译出example例程中间会出现很…

为什么用Selenium做自动化测试

手工测试的问题 手工操作点点点借助的是人脑的反应和聪明&#xff0c;为什么不用手点了呢&#xff1f;手会酸&#xff0c;脑子会累&#xff0c;会占据太多的时间。想一想为什么会学习自动化测试。我们都希望通过工具来解放我们的双手&#xff0c;大脑&#xff0c;眼睛。 为什…

四福来轮全向底盘实现写字功能

1. 功能说明 本文示例将实现R310b样机四福来轮全向底盘绘制“探索者”空心字的功能。 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigfish2.1扩展板 SH-ST步进电机扩展板电池11.1v动力电池 其它 步进…

【五一创作】( 字符串) 409. 最长回文串 ——【Leetcode每日一题】

❓ 409. 最长回文串 难度&#xff1a;简单 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的回文串 。 在构造过程中&#xff0c;请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s “abccccdd”…

Node服务端开发【NPM】

文章目录 前言NPM使用NPM使用场景NPM的常用命令NPM命令使用介绍使用NPM安装模块下载三方包全局安装VS本地安装本地安装全局安装全局模块路径查看与路径修改 卸载模块更新模块搜索模块NPM服务器发布包 NPM换源nrm全局安装 nrm:nrm ls 列出来现在已经配置好的所有的原地址nrm use…

2023年第二十届五一数学建模竞赛题目 C题详细思路

详细思路以及发布视频版&#xff0c;大家可以去观看&#xff0c;这里是对应的文字版&#xff0c;内容相差不多。 C题&#xff1a;“双碳”目标下低碳建筑研究 C题的问题设置其实是本次比赛最简单的一道&#xff0c;就是简单的综合评价预测模型。真正提升C题难度的其实是C题的…

git -团队开发 版本控制

文章目录 Git的概念Git的安装过程Git结构交互方式初始化本地仓库Git常用命令add和commit命令status命令log命令log命令2reset命令hard参数/mixed参数/soft参数 删除文件找回本地库删除的文件找回暂存区删除的文件 diff命令 分支操作分支冲突问题&#xff0c;如何解决冲突题 Git…