Java中使用List的stream流19中常用方法操作以及使用常用的filter、map、distinct、count、collect、skip、limit等方法进行数据列表的处理以及数据列表的分页

假设我有一个User类

// 示例数据
List<User> users = Arrays.asList(
    new User("Alice", 25, "Female"),
    new User("Bob", 30, "Male"),
    new User("Charlie", 35, "Male"),
    new User("Dave", 40, "Male"),
    new User("Eve", 22, "Female")
);

stream流19种常用方法

  • filter通过给定的条件(谓词)筛选流中的元素。

filter(Predicate<? super T> predicate):

// 1. filter(Predicate<? super T> predicate):筛选年龄大于30的用户
List<User> filteredUsers = users.stream()
                                .filter(user -> user.getAge() > 30)
                                .collect(Collectors.toList());
System.out.println("年龄大于30的用户:" + filteredUsers);
  • map将流中的每个元素映射为另一个值。

map(Function<? super T, ? extends R> mapper):

// 2. map(Function<? super T, ? extends R> mapper):转换为名称列表
List<String> names = users.stream()
                          .map(User::getName)
                          .collect(Collectors.toList());
System.out.println("名称列表:" + names);
  • flatMap将流中的每个元素映射为一个流,然后将这些流连接成一个流。

flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):

// 3. flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):拆分名称为字符列表
List<String> letters = users.stream()
                            .flatMap(user -> Arrays.stream(user.getName().split("")))
                            .collect(Collectors.toList());
System.out.println("拆分后的字母:" + letters);
  • distinct去除流中的重复元素。

distinct():

// 4. distinct():去重性别
List<String> uniqueGenders = users.stream()
                                  .map(User::getSex)
                                  .distinct()
                                  .collect(Collectors.toList());
System.out.println("去重后的性别:" + uniqueGenders);
  • sorted对流中的元素进行自然排序。

sorted():

// 5. sorted():按年龄自然排序
List<User> sortedUsersByAge = users.stream()
                                   .sorted((user1, user2) -> Integer.compare(user1.getAge(), user2.getAge()))
                                   .collect(Collectors.toList());
System.out.println("按年龄排序:" + sortedUsersByAge);
  • sorted使用自定义比较器对流中的元素进行排序。

sorted(Comparator<? super T> comparator):

// 6. sorted(Comparator<? super T> comparator):按名称长度排序
List<User> sortedUsersByNameLength = users.stream()
                                          .sorted((user1, user2) -> Integer.compare(user1.getName().length(), user2.getName().length()))
                                          .collect(Collectors.toList());
System.out.println("按名称长度排序:" + sortedUsersByNameLength);
  • peek对流中的每个元素执行操作,但不改变流中的元素。

peek(Consumer<? super T> action):

// 7. peek(Consumer<? super T> action):打印每个用户
users.stream()
     .peek(System.out::println)
     .collect(Collectors.toList());
  • limit截断流,使其最多只包含指定数量的元素。

limit(long maxSize):

// 8. limit(long maxSize):限制数量
List<User> limitedUsers = users.stream()
                               .limit(2)
                               .collect(Collectors.toList());
System.out.println("前两个用户:" + limitedUsers);
  • skip跳过指定数量的元素,返回剩余的元素组成的流。

skip(long n):

// 9. skip(long n):跳过前两个用户
List<User> skippedUsers = users.stream()
                               .skip(2)
                               .collect(Collectors.toList());
System.out.println("跳过前两个用户:" + skippedUsers);
  • forEach对流中的每个元素执行操作。

forEach(Consumer<? super T> action):

// 10. forEach(Consumer<? super T> action):遍历打印
System.out.println("打印每个用户:");
users.stream()
     .forEach(System.out::println);
  • toArray将流中的元素收集到一个数组中。

toArray():

// 11. toArray():转换为数组
User[] usersArray = users.stream()
                         .toArray(User[]::new);
System.out.println("用户数组:" + Arrays.toString(usersArray));
  • reduce使用给定的初始值和二元运算符将流中的元素合并为单个值。

reduce(T identity, BinaryOperator<T> accumulator):

// 12. reduce(BinaryOperator<T> accumulator):累加所有年龄
int totalAge = users.stream()
                    .map(User::getAge)
                    .reduce(0, Integer::sum);
System.out.println("所有用户年龄总和:" + totalAge);
  • collect将流中的元素收集到一个结果容器中,如列表、集合、映射等。

collect(Collector<? super T, A, R> collector):

// 13. collect(Collector<? super T, A, R> collector):按性别收集为Map
Map<String, List<User>> genderGroup = users.stream()
                                             .collect(Collectors.groupingBy(User::getSex));
System.out.println("按性别分组:" + genderGroup);
  • count计算流中的元素个数。

count():

// 14. count():计数
long userCount = users.stream()
                       .count();
System.out.println("用户数量:" + userCount);
  • anyMatch检查流中是否至少有一个元素满足给定条件。

anyMatch(Predicate<? super T> predicate):

 // 15. anyMatch(Predicate<? super T> predicate):是否存在年龄大于30的用户
 boolean anyOlderThan30 = users.stream()
                               .anyMatch(user -> user.getAge() > 30);
 System.out.println("是否存在年龄大于30的用户:" + anyOlderThan30);
  • allMatch检查流中的所有元素是否都满足给定条件。

allMatch(Predicate<? super T> predicate):

// 16. allMatch(Predicate<? super T> predicate):是否全部是女性
boolean allFemale = users.stream()
                         .allMatch(user -> "Female".equals(user.getSex()));
System.out.println("是否全部是女性:" + allFemale);
  • noneMatch检查流中是否没有任何元素满足给定条件。

noneMatch(Predicate<? super T> predicate):

// 17. noneMatch(Predicate<? super T> predicate):是否没有未成年用户
boolean noneUnder18 = users.stream()
                           .noneMatch(user -> user.getAge() < 18);
System.out.println("是否没有未成年用户:" + noneUnder18);
  • findFirst返回流中的第一个元素(如果存在)。

findFirst():

// 18. findFirst():获取第一个用户
Optional<User> firstUser = users.stream()
                                .findFirst();
System.out.println("第一个用户:" + firstUser.orElse(new User("", 0, "")));
  • findAny返回流中的任意一个元素(如果存在)。

findAny():

// 19. findAny():获取任意一个用户
Optional<User> anyUser = users.stream()
                              .findAny();
System.out.println("任意一个用户:" + anyUser.orElse(new User("", 0, "")));

使用skip和limit进行列表的分页操作

int size = 2; // 每页显示的数量
int current = 1; // 页码,从1开始

List<User> usersPerPage = users.stream()
                               .skip((current- 1) * size) // 跳过之前的页数
                               .limit(size) // 限制每页的数量
                               .collect(Collectors.toList());

System.out.println("第" + pageNumber + "页的用户:" + usersPerPage);

完整代码示例

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // 示例数据
        List<User> users = Arrays.asList(
            new User("Alice", 25, "Female"),
            new User("Bob", 30, "Male"),
            new User("Charlie", 35, "Male"),
            new User("Dave", 40, "Male"),
            new User("Eve", 22, "Female")
        );

        // 1. filter(Predicate<? super T> predicate):筛选年龄大于30的用户
        List<User> filteredUsers = users.stream()
                                        .filter(user -> user.getAge() > 30)
                                        .collect(Collectors.toList());
        System.out.println("年龄大于30的用户:" + filteredUsers);

        // 2. map(Function<? super T, ? extends R> mapper):转换为名称列表
        List<String> names = users.stream()
                                  .map(User::getName)
                                  .collect(Collectors.toList());
        System.out.println("名称列表:" + names);

        // 3. flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):拆分名称为字符列表
        List<String> letters = users.stream()
                                    .flatMap(user -> Arrays.stream(user.getName().split("")))
                                    .collect(Collectors.toList());
        System.out.println("拆分后的字母:" + letters);

        // 4. distinct():去重性别
        List<String> uniqueGenders = users.stream()
                                          .map(User::getSex)
                                          .distinct()
                                          .collect(Collectors.toList());
        System.out.println("去重后的性别:" + uniqueGenders);

        // 5. sorted():按年龄自然排序
        List<User> sortedUsersByAge = users.stream()
                                           .sorted((user1, user2) -> Integer.compare(user1.getAge(), user2.getAge()))
                                           .collect(Collectors.toList());
        System.out.println("按年龄排序:" + sortedUsersByAge);

        // 6. sorted(Comparator<? super T> comparator):按名称长度排序
        List<User> sortedUsersByNameLength = users.stream()
                                                  .sorted((user1, user2) -> Integer.compare(user1.getName().length(), user2.getName().length()))
                                                  .collect(Collectors.toList());
        System.out.println("按名称长度排序:" + sortedUsersByNameLength);

        // 7. peek(Consumer<? super T> action):打印每个用户
        users.stream()
             .peek(System.out::println)
             .collect(Collectors.toList());

        // 8. limit(long maxSize):限制数量
        List<User> limitedUsers = users.stream()
                                       .limit(2)
                                       .collect(Collectors.toList());
        System.out.println("前两个用户:" + limitedUsers);

        // 9. skip(long n):跳过前两个用户
        List<User> skippedUsers = users.stream()
                                       .skip(2)
                                       .collect(Collectors.toList());
        System.out.println("跳过前两个用户:" + skippedUsers);

        // 10. forEach(Consumer<? super T> action):遍历打印
        System.out.println("打印每个用户:");
        users.stream()
             .forEach(System.out::println);

        // 11. toArray():转换为数组
        User[] usersArray = users.stream()
                                 .toArray(User[]::new);
        System.out.println("用户数组:" + Arrays.toString(usersArray));

        // 12. reduce(BinaryOperator<T> accumulator):累加所有年龄
        int totalAge = users.stream()
                            .map(User::getAge)
                            .reduce(0, Integer::sum);
        System.out.println("所有用户年龄总和:" + totalAge);

        // 13. collect(Collector<? super T, A, R> collector):按性别收集为Map
        Map<String, List<User>> genderGroup = users.stream()
                                                     .collect(Collectors.groupingBy(User::getSex));
        System.out.println("按性别分组:" + genderGroup);

        // 14. count():计数
        long userCount = users.stream()
                               .count();
        System.out.println("用户数量:" + userCount);

        // 15. anyMatch(Predicate<? super T> predicate):是否存在年龄大于30的用户
        boolean anyOlderThan30 = users.stream()
                                      .anyMatch(user -> user.getAge() > 30);
        System.out.println("是否存在年龄大于30的用户:" + anyOlderThan30);

        // 16. allMatch(Predicate<? super T> predicate):是否全部是女性
        boolean allFemale = users.stream()
                                 .allMatch(user -> "Female".equals(user.getSex()));
        System.out.println("是否全部是女性:" + allFemale);

        // 17. noneMatch(Predicate<? super T> predicate):是否没有未成年用户
        boolean noneUnder18 = users.stream()
                                   .noneMatch(user -> user.getAge() < 18);
        System.out.println("是否没有未成年用户:" + noneUnder18);

        // 18. findFirst():获取第一个用户
        Optional<User> firstUser = users.stream()
                                        .findFirst();
        System.out.println("第一个用户:" + firstUser.orElse(new User("", 0, "")));

        // 19. findAny():获取任意一个用户
        Optional<User> anyUser = users.stream()
                                      .findAny();
        System.out.println("任意一个用户:" + anyUser.orElse(new User("", 0, "")));
    }
}

class User {
    private String name;
    private int age;
    private String sex;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getSex() {
        return sex;
    }

    @Override
    public String toString() {
        return "User{" +
               "name='" + name + '\'' +
               ", age=" + age +
               ", sex='" + sex + '\'' +
               '}';
    }
}
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaStream常用方法包括获取Stream方法和终结方法。 获取Stream方法有两种:集合获取Stream和数组获取Stream。集合获取Stream可以使用集合类的stream()方法,例如Map的keySet()方法可以获取键,values()方法可以获取值,entrySet()方法可以获取键值对。数组获取Stream可以使用Arrays类的stream()方法,将数组转换为Stream方法是对Stream进行操作方法,一次操作完毕之后,还可以继续进行其他操作常用方法包括filter()、map()、flatMap()、distinct()、sorted()、limit()和skip()等。filter()方法用于过滤元素,map()方法用于对元素进行映射,flatMap()方法用于扁平化处理distinct()方法用于去重,sorted()方法用于排序,limit()方法用于限制元素数量,skip()方法用于跳过元素。 终结方法Stream的最后一个操作,一个Stream只能有一个终结方法常用的终结方法包括forEach()、collect()、count()、min()、max()、reduce()和toArray()等。forEach()方法用于遍历元素,collect()方法用于将元素收集到集合count()方法用于统计元素数量,min()方法用于获取最小值,max()方法用于获取最大值,reduce()方法用于对元素进行归约操作,toArray()方法用于将元素转换为数组。 综合应用Stream常用方法可以实现对数据的筛选、转换、排序、统计等操作,提高代码的简洁性和可读性。 #### 引用[.reference_title] - *1* *2* *3* [Java 基础进阶篇(十二):Stream 常用方法总结](https://blog.csdn.net/weixin_43819566/article/details/130537949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

令人作呕的溏心蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值