Java8 Stream 流式编程

本文深入解析 Java 8 引入的 Stream API,涵盖如何从 Collection 创建流,使用 filter、map、flatMap 等方法进行数据处理,以及如何实现排序、去重、聚合等高级操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。

1.Collection创建流
stream() : 为集合创建串行流
parallelStream() : 为集合创建并行流

List<String> list = Arrays.asList("A", "B", "C", "D");
// 创建串行流对象
Stream stream = list.stream();
// 创建并行流对象
Stream parallelStream = list.parallelStream();

2.Stream常用方法
filter
过滤元素,通过设置条件过滤元素

List<String> list = Arrays.asList("A", "", "B", "", "C", "D");
// 过滤掉空元素
List<String> filtered = list.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
filtered.forEach(n -> System.out.println(n));

map
元素一对一转换

List<String> list = Arrays.asList("1", "2", "3", "4");
// mapToInt 字符串转int
list.stream().mapToInt(v -> Integer.valueOf(v)).forEach(System.out::println); // 1 2 3 4
// mapToLong 字符串转long
list.stream().mapToLong(v -> Long.valueOf(v)).forEach(System.out::println); // 1 2 3 4
// mapToDouble 字符串转double
list.stream().mapToDouble(v -> Double.valueOf(v)).forEach(System.out::println); // 1.0 2.0 3.0 4.0

peek

List<String> list = Arrays.asList("1", "2", "3", "4");
// peek对Stream中的元素进行操作后,并不会把操作后的数据返回到Stream,所以其中的元素不变。
list.stream().peek(v -> Double.valueOf(v)).forEach(System.out::println); // 1 2 3 4

flatMap
元素一对多转换

List<String> list = Arrays.asList("1,2", "3", "4", "5");
// 元素一对多转换 
List<String> resList = list.stream().flatMap(v -> Stream.of(v.split(","))).collect(Collectors.toList());
resList.forEach(System.out::println); // 1 2 3 4 5

distinct
去掉重复元素

List<String> list = Arrays.asList("1", "1", "2", "3");
// 去重
List<String> resList = list.stream().distinct().collect(Collectors.toList());
resList.forEach(System.out::println);// 1 2 3

sorted
排序

List<Integer> list = Arrays.asList(3, 2, 1, 4);
// 排序
List<Integer> resList = list.stream().sorted().collect(Collectors.toList());
resList.forEach(System.out::println); // 1 2 3 4

limit
返回前n个元素

List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 返回前2个元素
List<Integer> resList = list.stream().limit(2).collect(Collectors.toList());
resList.forEach(System.out::println); // 1 2

skip
跳过前n个元素

List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 跳过前一个元素
List<Integer> resList = list.stream().skip(1).collect(Collectors.toList());
resList.forEach(System.out::println); // 2 3 4

forEach
遍历

List<Integer> list = Arrays.asList(1, 2, 3, 4);
list.stream().forEach(System.out::println); // 1 2 3 4
// 并行 输出顺序不确定
list.parallelStream().forEach(System.out::println);

forEachOrdered
遍历

List<Integer> list = Arrays.asList(1, 2, 3, 4);
list.stream().forEachOrdered(System.out::println); // 1 2 3 4
// 并行 输出顺序确定
list.parallelStream().forEachOrdered(System.out::println);

reduce
进行聚合求值

List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 累计
Optional<Integer> sum = list.stream().reduce((a, b) -> {
    return a + b;
});
 System.out.println(sum.get());  //   10

collect
收集元素

List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 合并成list
List<Integer> a1 = list.stream().collect(Collectors.toList());

count
返回元素个数

List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 返回个数
long count = list.stream().count();

match
判断是否有元素符合条件

List<Integer> list = Arrays.asList(1, 2, 3, 4);
// 判断元素中是否有等于1的 anyMatch 只要有一个元素符合条件时就返回true
boolean anyMatch = list.stream().anyMatch(e -> e == 1);
System.out.println(anyMatch); // true
// 判断元素是否小于5  allMatch 所有元素符合条件才返回true
boolean allMatch = list.stream().allMatch(e -> e < 5);
System.out.println(allMatch);
// 判断元素是否小于5 noneMatch 所有元素都不符合条件时返回true
boolean noneMatch = list.stream().noneMatch(e -> e < 5);
System.out.println(noneMatch);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值