Java 8 Stream API:简化集合处理的优雅之道

Java 8引入了Stream API,标志着集合处理进入了一个全新的时代。Stream API以函数式编程风格,提供了高效、简洁的方式来处理集合数据。通过一系列流操作,如过滤、映射、排序等,你可以轻松完成复杂的集合处理任务,而无需编写冗长的迭代代码。本文将带你快速了解Stream API的核心概念和用法,让你领略到它带来的编程之美。无论是初学者还是资深开发者,都能从中受益,提升Java编程的效率和乐趣。


定义基础数据

@Data
public class User implements Serializable {
    public static final List<User> list = new ArrayList<>();
    private static final long serialVersionUID = -3313090483884742935L;

    static {
        list.add(User.create("张三", 18, 1, LocalDate.of(1990, 1, 1)));
        list.add(User.create("李四", 19, 2, LocalDate.of(1991, 2, 2)));
        list.add(User.create("王五", 28, 2, LocalDate.of(2000, 3, 3)));
    }

    private String name;
    private Integer age;
    private Integer sex;
    private LocalDate birthday;

    public static User create(String name, int age, int sex, LocalDate birthday) {
        User user2 = new User();
        user2.setName(name);
        user2.setAge(age);
        user2.setSex(sex);
        user2.setBirthday(birthday);
        return user2;
    }
}

示例:

        // 筛选出年龄大于18的用户
        List<User> collect = list.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());

        // 筛选出性别为2的用户
        List<User> collect1 = list.stream().filter(user -> user.getSex() == 2).collect(Collectors.toList());

        // 将用户列表映射为年龄列表
        // 等同于list.stream().map(user -> user.getAge()).collect(Collectors.toList()); 不过使用的是Java8的方法引用
        List<Integer> collect2 = list.stream().map(User::getAge).collect(Collectors.toList());

        // 映射用户名的长度列表
        List<Integer> collect3 = list.stream().map(user -> user.getName().length()).collect(Collectors.toList());

        // 筛选出年龄大于18的用户,并获取其名字列表
        List<String> collect4 = list.stream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toList());
        // 筛选出年龄大于18的用户,并获取其名字集合,确保唯一性
        Set<String> collect5 = list.stream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toSet());

        // 查找年龄最大的用户
        Optional<User> optional = list.stream().max(Comparator.comparingInt(User::getAge));
        // 查找年龄最小的用户
        Optional<User> optional1 = list.stream().min(Comparator.comparingInt(User::getAge));

        // 统计年龄大于18的用户数量
        long count = list.stream().filter(user -> user.getAge() > 18).count();

        // 获取不同的性别列表
        List<Integer> collect6 = list.stream().map(User::getSex).distinct().collect(Collectors.toList());

        // 查找第一个性别为2的用户
        Optional<User> optional2 = list.stream().filter(user -> user.getSex() == 2).findFirst();

        // 查找任意一个性别为2的用户
        Optional<User> optional3 = list.stream().filter(user -> user.getSex() == 2).findAny();

        // 获取前两个用户
        List<User> collect7 = list.stream().limit(2).collect(Collectors.toList());

        // 跳过前两个用户
        List<User> collect8 = list.stream().skip(2).collect(Collectors.toList());

        // 跳过第一个用户,获取接下来的两个用户
        List<User> collect9 = list.stream().skip(1).limit(2).collect(Collectors.toList());

        // 按生日升序排序用户
        List<User> collect10 = list.stream().sorted(Comparator.comparing(User::getBirthday)).collect(Collectors.toList());
        // 按生日降序排序用户
        List<User> collect11 = list.stream().sorted(Comparator.comparing(User::getBirthday).reversed()).collect(Collectors.toList());

        // 计算所有用户年龄的总和
        int sum = list.stream().mapToInt(User::getAge).sum();
        // 获取所有用户中最大的年龄
        int max = list.stream().mapToInt(User::getAge).max().getAsInt();
        // 获取所有用户中最大的年龄,如果没有则默认为0
        int max1 = list.stream().mapToInt(User::getAge).max().orElse(0);
        // 获取所有用户中最小的年龄
        int min = list.stream().mapToInt(User::getAge).min().getAsInt();
        // 获取所有用户中最小的年龄,如果没有则默认为0
        int min1 = list.stream().mapToInt(User::getAge).min().orElse(0);
        // 计算所有用户年龄的平均值
        double avg = list.stream().mapToInt(User::getAge).average().getAsDouble();
        // 计算所有用户年龄的平均值,如果没有则默认为0
        double avg1 = list.stream().mapToInt(User::getAge).average().orElse(0);

        // 找出年龄最大的用户
        User reduce = list.stream().reduce((a, b) -> a.getAge() > b.getAge() ? a : b).orElse(null);

        // 将所有用户的金额相加
        BigDecimal decimal = list.stream().map(User::getMoney).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);

        // 将用户名转换为字符流
        Stream<Character> collect12 = list.stream().flatMap(user -> user.getName().chars().mapToObj(c -> (char) c));

        // 将用户名转换为整数流
        IntStream intStream = list.stream().flatMapToInt(user -> user.getName().chars());

        // 将用户名转换为长整数流
        LongStream longStream = list.stream().flatMapToLong(user -> user.getName().chars().mapToLong(c -> c));

        // 将用户名转换为双精度浮点数流
        DoubleStream doubleStream = list.stream().flatMapToDouble(user -> user.getName().chars().mapToDouble(c -> c));

        // 按性别分组用户
        Map<Integer, List<User>> collect14 = list.stream().collect(Collectors.groupingBy(User::getSex));

        // 检查所有用户是否都大于18岁
        boolean allMatch = list.stream().allMatch(user -> user.getAge() > 18);
        // 检查是否有用户大于18岁
        boolean anyMatch = list.stream().anyMatch(user -> user.getAge() > 18);
        // 检查是否所有用户都小于等于18岁
        boolean noneMatch = list.stream().noneMatch(user -> user.getAge() > 18);

        // 创建一个名字到用户映射的字典
        Map<String, User> collect15 = list.stream().collect(Collectors.toMap(User::getName, user -> user));
        // 创建一个名字到生日的映射的字典
        Map<String, LocalDate> collect16 = list.stream().collect(Collectors.toMap(User::getName, User::getBirthday));

        // 将所有用户名连接成一个字符串
        String collect17 = list.stream().map(User::getName).collect(Collectors.joining());
        // 将所有用户名以逗号分隔连接成一个字符串
        String collect18 = list.stream().map(User::getName).collect(Collectors.joining(","));

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值