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

字符串例子:

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);
}


你可能感兴趣的:(分享经验,java)