java8利用Stream流,统计元素出现次数,筛选只出现一次的,或出现多次的元素

本文通过两个实战案例介绍 Java Stream API 的使用技巧:一是利用 Stream 处理字符串列表,筛选并统计只出现一次的元素;二是操作 User 对象列表,按年龄分组并找出重复年龄段的用户。

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

字符串例子:

public void main()
{
    // 初始化流
    List<String> list = Stream.of("1","1","2","3","4","4","4","5","6","7")
            // 收集 Collectors.toMap(map的key[Function.identity()表示自己本身], map的value, 当key重复值的处理[我这里选择让value相加])
            .collect(Collectors.toMap(Function.identity(), s -> 1, Integer::sum))
            // map 转 entrySet
            .entrySet()
            // 继续转流
            .stream()
            // 筛选只出现一次的元素
            .filter(entry -> entry.getValue() == 1)
            // 获取key
            .map(Map.Entry::getKey)
            // 统计只出现一次的元素
            .collect(Collectors.toList());
    // [2, 3, 5, 6, 7]
    System.out.println(list);
}

User对象例子:

// User类
public class User implements Serializable
{
    private String userName;
    private Integer age;
    private String sex;
    private String phone;
    
	// 省略 get set....

    public static List<User> getUsers()
    {
        List<User> users = new ArrayList<User>();
        users.add(new User("小胖", 15, "男", "13812345671"));
        users.add(new User("小白", 18, "女", "13812345672"));
        users.add(new User("小黑", 38, "男", "13812345673"));
        users.add(new User("阿胖", 25, "女", "13812345674"));
        users.add(new User("阿12", 25, "女", "13812345674"));
        return users;
    }
}

public void main()
{
    Map<Integer, List<User>> list = User.getUsers().stream()
            .collect(Collectors.toMap(User::getAge, user -> new ArrayList<User>() {{add(user);}}, (list1, list2) ->
            {
                list1.addAll(list2);
                return list1;
            }))
            .entrySet()
            .stream()
            // 筛选只出现一次的元素
            .filter(entry -> entry.getValue().size() > 1)
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    // {25=[User{userName='阿胖', age=25, sex='女', phone='13812345674'}, User{userName='阿12', age=25, sex='女', phone='13812345674'}]}
    System.out.println(list);
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值