深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能

深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能

Java 8 引入的 Stream API 使得集合操作更加简洁和高效。本文通过详细示例,展示如何利用 Stream API 进行各种集合操作,包括遍历、转换、过滤、排序、分组、去重等。

1. 遍历集合

示例:使用 forEach 遍历列表

import java.util.Arrays;
import java.util.List;public class ForEachExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 使用 forEach 遍历列表names.forEach(name -> System.out.println(name));}
}

示例:使用 forEach 遍历 Map

import java.util.HashMap;
import java.util.Map;public class ForEachMapExample {public static void main(String[] args) {Map<String, Integer> ages = new HashMap<>();ages.put("Peter", 30);ages.put("Anna", 25);ages.put("Mike", 35);// 使用 forEach 遍历 Mapages.forEach((name, age) -> System.out.println(name + ": " + age));}
}

2. List 转 Map

示例:将 List 转换为 Map

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;class Person {private String name;private int age;// 构造方法和 getter 方法public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}
}public class ListToMapExample {public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Peter", 30), new Person("Anna", 25), new Person("Peter", 28));// 将 List 转换为 MapMap<String, Integer> personMap = people.stream().collect(Collectors.toMap(Person::getName, Person::getAge, (existing, replacement) -> existing));personMap.forEach((name, age) -> System.out.println(name + ": " + age));// 有序写法Map<String, Person> personOrderlyMap = people.stream().collect(Collectors.toMap(Person::getName,a -> a, (oldValue, newValue) -> newValue, LinkedHashMap::new));// value为对象时,也可以这样写,注意ID相同时,会抛异常Map<String, Person> personMapOther = people.stream().collect(Collectors.toMap(Person::getName, person -> person));// 还可以这样写 输出跟输入一样的Lambda表达式对象,等价于person -> personMap<String, Person> personAscMap = people.stream().collect(Collectors.toMap(Person::getName, Function.identity()));// map按key排序 默认正序,反序为: Map.Entry.comparingByKey().reversed()Map<String, Person> personDescMap = personAscMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new));}
}

3. 过滤和映射

示例:过滤列表

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FilterExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 过滤名字以 "P" 开头的元素List<String> filteredNames = names.stream().filter(name -> name.startsWith("P")).collect(Collectors.toList());System.out.println(filteredNames); // 输出:[Peter]}
}

示例:映射列表

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class MapExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 将名字转换为大写List<String> upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(upperCaseNames); // 输出:[PETER, ANNA, MIKE, XENIA]}
}

4. 聚合操作

示例:求和

import java.util.Arrays;
import java.util.List;public class SumExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 Stream API 计算总和int sum = numbers.stream().mapToInt(Integer::intValue).sum();System.out.println("Sum: " + sum); // 输出:Sum: 15}
}

示例:求平均值

import java.util.Arrays;
import java.util.List;
import java.util.OptionalDouble;public class AverageExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 Stream API 计算平均值OptionalDouble average = numbers.stream().mapToInt(Integer::intValue).average();System.out.println("Average: " + (average.isPresent() ? average.getAsDouble() : "N/A"));}
}

5. 分组和分区

示例:按条件分组

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class GroupingByExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 按名字的长度分组Map<Integer, List<String>> groupedByLength = names.stream().collect(Collectors.groupingBy(String::length));groupedByLength.forEach((length, nameList) -> System.out.println(length + ": " + nameList));}
}

示例:按条件分区

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;public class PartitioningByExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 按是否为偶数分区Map<Boolean, List<Integer>> partitionedByEven = numbers.stream().collect(Collectors.partitioningBy(n -> n % 2 == 0));partitionedByEven.forEach((isEven, numList) -> System.out.println(isEven + ": " + numList));}
}

6. 并行流

示例:使用并行流提高性能

import java.util.Arrays;
import java.util.List;public class ParallelStreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用并行流计算总和int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();System.out.println("Sum: " + sum); // 输出:Sum: 55}
}

7. 去重操作

示例:去除列表中的重复元素

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class DistinctExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Anna", "Xenia", "Peter");// 使用 distinct 去重List<String> uniqueNames = names.stream().distinct().collect(Collectors.toList());System.out.println(uniqueNames); // 输出:[Peter, Anna, Mike, Xenia]// 对象,根据ID去重List<User> duplicateRemoval = zxrMaps.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getId))), ArrayList::new));}
}

8. 收集结果

示例:将列表转换为 Set

import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;public class ToSetExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 将列表转换为 SetSet<String> nameSet = names.stream().collect(Collectors.toSet());System.out.println(nameSet);}
}

示例:连接字符串

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class JoiningExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 连接字符串,使用逗号分隔String joinedNames = names.stream().collect(Collectors.joining(", "));System.out.println(joinedNames); // 输出:Peter, Anna, Mike, Xenia}
}

9. 映射和扁平化

示例:扁平化嵌套列表

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class FlatMapExample {public static void main(String[] args) {List<List<String>> nestedList = Arrays.asList(Arrays.asList("Peter", "Anna"),Arrays.asList("Mike", "Xenia"));// 扁平化嵌套列表List<String> flatList = nestedList.stream().flatMap(List::stream).collect(Collectors.toList());System.out.println(flatList); // 输出:[Peter, Anna, Mike, Xenia]}
}

10. 生成流

示例:生成数值范围

import java.util.stream.IntStream;public class IntStreamRangeExample {public static void main(String[] args) {// 生成 1 到 10 的数值范围IntStream.rangeClosed(1, 10).forEach(System.out::println);}
}

11. 归约操作

示例:使用 reduce 求和

import java.util.Arrays;
import java.util.List;public class ReduceSumExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 reduce 求和int sum = numbers.stream().reduce(0, Integer::sum);System.out.println("Sum: " + sum); // 输出:Sum: 15}
}

示例:使用 reduce 求乘积

import java.util.Arrays;
import java.util.List;public class ReduceProductExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 reduce 求乘积int product = numbers.stream().reduce(1, (a, b) -> a * b);System.out.println("Product: " + product); // 输出:Product: 120}
}

12. 排序和查找

示例:排序列表

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class SortExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 排序列表List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());System.out.println(sortedNames); // 输出:[Anna, Mike, Peter, Xenia]}
}

示例:查找第一个匹配元素

import java.util.Arrays;
import java.util.List;
import java.util.Optional;public class FindFirstExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 查找第一个以 "P" 开头的元素Optional<String> firstMatchingName = names.stream().filter(name -> name.startsWith("P")).findFirst();System.out.println("First matching name: " + firstMatchingName.orElse("No match"));}
}

13. 自定义收集器

示例:自定义收集器

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;public class CustomCollectorExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 自定义收集器String result = names.stream().collect(Collector.of(StringBuilder::new,(sb, name) -> sb.append(name).append("|"),StringBuilder::append,StringBuilder::toString));System.out.println(result); // 输出:Peter|Anna|Mike|Xenia|}
}

14. List 并集、差集、交集

// list1
List<String> list1 = Arrays.asList("a", "b", "c");// list2
List<String> list2 = Arrays.asList("b", "c", "d");// 交集 ("b", "c")
List<String> intersection = list1.stream().filter(item -> list2.contains(item)).collect(toList());// 差集 (list1 - list2)
List<String> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(toList());// 差集 (list2 - list1)
List<String> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(toList());// 并集 (list1 + list2)
List<String> listAll = new ArrayList();
listAll.addAll(list1);
listAll.addAll(list2);
listAll.parallelStream().forEach(System.out :: println);// 并集去重
List<String> listAllDistinct = listAll.stream().distinct().collect(toList());

总结

Java 8 的 Stream API 通过提供流畅、声明式的编程方式,使集合操作更加灵活和高效。本文通过详尽的示例展示了 Stream API 在遍历、转换、过滤、分组、去重、并行处理等方面的强大功能。这些新特性不仅提高了代码的简洁性和可读性,还显著提升了开发效率。

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

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

相关文章

Spring MVC+mybatis项目入门:旅游网(四)用户注册——mybatis的配置与使用以及Spring MVC重定向

个人博客&#xff1a;Spring MVCmybatis项目入门:旅游网&#xff08;四&#xff09;用户注册2-持久化 | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代&#xff08;2024年…

使用STM32F103标准库实现自定义键盘

使用STM32F103标准库实现自定义键盘 在嵌入式系统中&#xff0c;自定义键盘的实现是一个经典的项目&#xff0c;能够帮助我们深入理解GPIO配置、按键扫描和中断处理等知识。本文将详细介绍如何使用STM32F103标准库来实现一个简单的自定义键盘。 1. 准备工作 1.1 硬件准备 S…

springboot相关知识集锦----1

一、springboot是什么&#xff1f; springboot是一个用于构建基于spring框架的独立应用程序的框架。它采用自动配置的原则&#xff0c;以减少开发人员在搭建应用方面的时间和精力。同时提升系统的可维护性和可扩展性。 二、springboot的优点 约定优于配置 版本锁定&#xf…

嵌入式0基础开始学习 ⅠC语言(9)小结补充

这一章呢&#xff0c;来讲一些之前没讲到过的一些点 1.作用域 什么是作用域&#xff1f; 一个东西(对象)起作用的范围。 变量的作用域 函数的作用域 类型的作用域 一个c语言工…

C#【进阶】特殊语法

特殊语法、值和引用类型 特殊语法 文章目录 特殊语法1、var隐式类型2、设置对象初始值3、设置集合初始值4、匿名类型5、可空类型6、空合并操作符7、内插字符串8、单句逻辑简略写法 值和引用类型1、判断值和引用类型2、语句块3、变量的生命周期4、结构体中的值和引用5、类中的值…

Hive 常用指标分析

常用指标分析 用户留存率路径分析7日品牌复购率7天内连续三天登录每分钟在线人数 1. 用户留存率 在使用 Hive 统计用户留存率时&#xff0c;我们通常会涉及到两个主要日期&#xff1a;用户注册日期和用户在后续某天的活跃日期。留存率通常是指用户在注册后的某一天仍然活跃的…

重学java 45.多线程 下 总结 定时器_Timer

人开始反向思考 —— 24.5.26 定时器_Timer 1.概述:定时器 2.构造: Timer() 3.方法: void schedule(TimerTask task, Date firstTime, long period) task:抽象类,是Runnable的实现类 firstTime:从什么时间开始执行 period:每隔多长时间执行一次…

内蒙古包头师范学院体育学院车志宏教授

女&#xff0c;汉族&#xff0c;体育学院院长&#xff0c;承担学校体育学、篮球等课程教学工作&#xff0c;曾住持自治区3项科研项目&#xff0c;发表论文5篇&#xff0c;获奖2篇。 1992年天津体育学院体育教育专业&#xff0c;获学士学位&#xff1b; 1998年天津外国语大学体…

fpga问题整理

1、quartus联合modelsim仿真 无波形 问题&#xff1a; modelsim仿真无波形&#xff0c;打开transcript可以看到警告。 警告&#xff1a; # ** Warning: (vlog-2083) f:/program files/altera/ 13.1/quartus/ eda/sim_lib/ altera_lnsim.sv(22728): Carriage return (0x0D) is…

MySQL之Schema与数据类型优化(五)

Schema与数据类型优化 特殊类型数据 某些类型的数据并不直接与内置类型一致。低于秒级精度的时间戳就是一个例子。另外一个例子是一个IPv4地址。人们经常使用VARCHAR(15)列存储IP地址。然而&#xff0c;它们实际上是32位无符号整数。不是字符串。用小数点将地址分成四段的表示…

用AI比赛助手降维打击数学建模,比赛过程详细介绍,这保研不就稳了吗

数学建模是个小众的赛道&#xff0c;可能很多大学生不知道&#xff0c;简单来说&#xff1a;他能薅学分、保研加分、毕业好找工作(简历上写一辈子)&#xff0c;尤其是基于GPT-4o模型&#xff0c;简直对他们是降维打击。 数学建模每年的比赛非常多&#xff0c;像国赛、美赛、深…

asrpro softspi SD卡读写

采样 50M 1M&#xff1b;采样时间足够长&#xff0c;采样频率1M 避免信息遗漏 引脚 cs pa2 mosi pa3 sck pa5 miso pa6 vcc ->5v gnd ->gnd ARDUINO SD库与移植&#xff08;原本是打算移值tw ch32v103的sd库的&#xff0c;但没有对比&#xff0c;只能选择arduino ; …

Keras深度学习框架第二十六讲:使用KerasNLP上传模型

1、上传模型的概念 在机器学习和深度学习领域&#xff0c;"上传模型"通常指的是将训练好的模型保存到某个位置&#xff0c;以便后续使用或分享&#xff0c;而不是直接通过KerasNLP库进行上传操作。但在这里&#xff0c;我们可以理解为保存和分享模型。 当程序员使用…

Java进阶学习笔记22——泛型方法、通配符和上下限

泛型方法&#xff1a; package cn.ensource.d11_generics_method;public class Test {public static void main(String[] args) {// 泛型方法String res test("Java");System.out.println(res);Dog dog1 test(new Dog());System.out.println(dog1);}// 泛型方法pub…

手机上制作证件照

最近由于需要给老姐弄一组证件照&#xff0c;找了一通手机上的软件&#xff0c;找到一款性价比较高的&#xff0c;详细流程记录下来。vx小程序上搜索"泰世茂证件照"&#xff0c;打开首页如下图所示∶ 单击"开始制作" &#xff0c;选择一个证件照类别&#…

Paddle 傅里叶变换基础及领域应用

Paddle 傅里叶变换基础及领域应用 1. 傅里叶变换基础 1.1 傅里叶变换简介 傅里叶变换是一种重要的信号处理技术&#xff0c;它可以将一个信号从时域转换到频域。在频域中&#xff0c;信号的频率特性更加明显&#xff0c;有利于分析和处理。傅里叶变换的基本思想是将一个信号…

基于Rsoft的Fullwave仿真模块进行双芯波导能量耦合与波分复用

Rsoft中的Fullwave仿真模块可以更精确的仿真微小结构&#xff0c;按照建立模型&#xff0c;设置参数&#xff0c;监测能量&#xff0c;优化结构的思路对其进行仿真。图1是在Fullwave模块中建立的双芯波导仿真模型。在模型中设置好折射率、光源、光路、监测器等便可以进行仿真。…

Ubtuntu下安装配置SSH详解

在Ubuntu下安装SSH并配置远程连接&#xff0c;你可以遵循以下步骤&#xff1a; 安装OpenSSH Serve sudo apt update 安装OpenSSH Server&#xff1a; 使用以下命令安装OpenSSH服务器软件包&#xff1a; sudo apt install openssh-server 安装过程可能会要求你确认操作&#x…

Spring STOMP-STOMP客户端

Spring提供了一个基于WebSocket的STOMP客户端和一个基于TCP的STOMP客户端。 首先&#xff0c;你可以创建并配置WebSocketStompClient&#xff0c;如下所示&#xff1a; WebSocketClient webSocketClient new StandardWebSocketClient(); WebSocketStompClient stompClient …

【竞技宝】英超:滕哈格命真硬!足总杯夺冠获欧联资格

足总杯决赛结束,曼联爆冷2比1击败联赛冠军曼城夺冠,滕哈格再一次用顶级理解带队拿到杯赛冠军。赛前曼彻斯特当地有媒体爆料,曼联管理层已经决定要在足总杯决赛之后解雇滕哈格,这个消息让不少球迷都很担心滕哈格的状态。但是荷兰主帅凭借强大的内心,带领球队击败了不可一世的曼城…