Java Stream 流操作详解与常见用法大全

在 Java 8 中引入的 Stream 是一个非常强大的工具,它让我们可以以声明式的方式操作集合,提高代码的可读性和可维护性。本文将深入讲解 Java Stream 的常用操作及其实际使用场景,适合初学者到中级开发者学习使用。

在公司常常会有很多表,要对dto字段拼接,所以常常会用stream流

一、什么是 Stream?

Stream 是 Java 中对集合对象功能的增强,它专注于对集合数据进行复杂操作,比如筛选、排序、映射、聚合等,并且可以链式调用,写出简洁优雅的代码。

注意:Stream 不会改变原始数据源,它会返回一个新的流或结果。

 

二、Stream 的常用方法

我们下面通过一个 User 类来演示常用用法:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String gender;
}

假设我们有一个用户集合:

List users = Arrays.asList(
    new User("Tom", 25, "Male"),
    new User("Lucy", 19, "Female"),
    new User("Jack", 30, "Male"),
    new User("Lily", 22, "Female")
);

三、Stream 常见操作汇总

1. filter():过滤数据

List filtered = users.stream()
    .filter(user -> user.getAge() > 20)
    .collect(Collectors.toList());

多个条件可以用逻辑运算符:

.filter(user -> user.getAge() > 20 && "Male".equals(user.getGender()))

2. map():数据映射或字段转换

List names = users.stream()
    .map(User::getName)
    .collect(Collectors.toList());

修改对象内部字段:

List modified = users.stream()
    .map(user -> {
        user.setName(user.getName() + "_new");
        return user;
    }).collect(Collectors.toList());

3. sorted():排序

按照年龄升序:

List sorted = users.stream()
    .sorted(Comparator.comparing(User::getAge))
    .collect(Collectors.toList());

按照年龄降序:

.sorted(Comparator.comparing(User::getAge).reversed())

4. limit()skip():分页处理

  • limit(n):取前 n 个元素

  • skip(n):跳过前 n 个元素

List limited = users.stream()
    .skip(1)
    .limit(2)
    .collect(Collectors.toList());

 

5. collect():收集结果

常用的收集器:

  • Collectors.toList()

  • Collectors.toSet()

  • Collectors.toMap(keyMapper, valueMapper)

Map nameAgeMap = users.stream()
    .collect(Collectors.toMap(User::getName, User::getAge));

 6. forEach():遍历

users.forEach(user -> System.out.println(user.getName()));

stream().forEach() 的区别:

  • users.forEach 是集合的方法,遍历原始集合;

  • users.stream().forEach 是对流操作后的集合进行遍历。

7. anyMatch() / allMatch() / noneMatch() 

boolean hasAdult = users.stream().anyMatch(user -> user.getAge() >= 18);
boolean allAdult = users.stream().allMatch(user -> user.getAge() >= 18);
boolean noneTeen = users.stream().noneMatch(user -> user.getAge() < 13);

8. count()min()max()reduce()

long count = users.stream().count();

Optional min = users.stream()
    .min(Comparator.comparing(User::getAge));

✅总结:Stream 操作速查表

方法 功能描述
filter() 过滤元素
map() 元素映射/转换
sorted() 排序
limit() 获取前 n 条
skip() 跳过前 n 条
forEach() 遍历
collect() 终端收集
toMap() 转换为 Map
anyMatch() 是否有任意一个符合条件
allMatch() 是否全部符合条件
noneMatch() 是否全部不符合条件
count() 统计数量
reduce() 聚合操作

如果你觉得这篇文章有帮助,欢迎点赞、收藏、转发! 

你可能感兴趣的:(java,开发语言,程序员创富)