Java集合工具类(Java集合转换、去重、过滤、分组)

Java8中的Lambda+Stream简化了我们对集合类的操作。

通过Lambda+Stream,可以很简洁地实现集合转换、去重、过滤、分组等操作。

以下为封装好的工具类:

package utils;

import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class CollectionKit {
    private CollectionKit() {
    }

    /**
     * 任意集合Collection<T>转换为List<R>
     *
     * @param collection
     * @param mapper
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> List<R> convertToList(Collection<T> collection,
                                               Function<? super T, ? extends R> mapper) {
        if (collection == null || collection.isEmpty()) {
            return new ArrayList<>();
        }
        return collection.stream().map(mapper).collect(Collectors.toList());
    }

    /**
     * 任意集合Collection<T>转换为Set<R>
     *
     * @param collection
     * @param mapper
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> Set<R> convertToSet(Collection<T> collection,
                                             Function<? super T, ? extends R> mapper) {
        if (collection == null || collection.isEmpty()) {
            return new HashSet<>();
        }
        return collection.stream().map(mapper).collect(Collectors.toSet());
    }

    /**
     * 任意集合Collection<T>转换为Map<R, T>
     * map中,key为keyMapper转换后结果,value为对象本身,如果key相同则覆盖
     *
     * @param collection
     * @param keyMapper
     * @param <T>
     * @param <K>
     * @return
     */
    public static <T, K> Map<K, T> convertToMap(Collection<T> collection,
                                                Function<? super T, ? extends K> keyMapper) {
        if (collection == null || collection.isEmpty()) {
            return new HashMap<>();
        }
        return collection.stream().collect(Collectors.toMap(keyMapper, Function.identity(), (key1, key2) -> key2));
    }

    /**
     * 任意集合Collection<T>转换为Map<R, T>
     * map中,key为keyMapper转换后结果,value为对象本身,如果key相同则覆盖
     *
     * @param collection
     * @param keyMapper
     * @param <T>
     * @param <K>
     * @param <V>
     * @return
     */
    public static <T, K, V> Map<K, V> convertToMap(Collection<T> collection,
                                                   Function<? super T, ? extends K> keyMapper,
                                                   Function<? super T, ? extends V> valueMapper) {
        if (collection == null || collection.isEmpty()) {
            return new HashMap<>();
        }
        return collection.stream().collect(Collectors.toMap(keyMapper, valueMapper, (key1, key2) -> key2));
    }

    /**
     * 筛选出满足条件的数据
     *
     * @param collection
     * @param filterPredicate
     * @param <T>
     * @return
     */
    public static <T> List<T> filter(Collection<T> collection,
                                     Predicate<? super T> filterPredicate) {
        if (collection == null || collection.isEmpty()) {
            return new ArrayList<>();
        }
        return collection.stream().filter(filterPredicate).collect(Collectors.toList());
    }

    /**
     * 分组
     * 分组键为classifier执行结果
     * @param collection
     * @param classifier
     * @param <T>
     * @param <K>
     * @return
     */
    public static <T, K> Map<K, List<T>> group(Collection<T> collection,
                                               Function<? super T, ? extends K> classifier) {
        if (collection == null || collection.isEmpty()) {
            return new HashMap<>();
        }
        return collection.stream().collect(Collectors.groupingBy(classifier));
    }

    /**
     * 根据条件去重
     *
     * @param collection
     * @param comparing
     * @param <T>
     * @return
     */
    public static <T> List<T> distinct(Collection<T> collection,
                                       Comparator<T> comparing) {
        return collection.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(comparing)), ArrayList::new));
    }
}

使用详解:

数据准备:

    class User {
        String name;
        int age;

        public String getName() { return name; }

        public void setName(String name) { this.name = name; }

        public int getAge() { return age; }

        public void setAge(int age) { this.age = age; }

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

    List<User> users = new ArrayList<>();
    users.add(new User("张三", 10));
    users.add(new User("李四", 10));
    users.add(new User("王五", 20));
    users.add(new User("张三", 25));

1、转换为新的list,每个用户转换为名字+年龄格式的字符串

List<String> list = CollectionKit.convertToList(users, item -> item.name + "_" + item.age);
运行结果:[张三_10, 李四_10, 王五_20, 张三_25]

2、使用convertToSet得到所有用户的年龄(去除重复项)

Set<Integer> set = CollectionKit.convertToSet(users, User::getAge);
运行结果:[20, 25, 10]

3、使用convertToMap转换为key=name,value=user格式的map

Map<String, User> map = CollectionKit.convertToMap(users, User::getName);
运行结果:
{
     李四=User{name='李四', age=10},
     张三=User{name='张三', age=25},
     王五=User{name='王五', age=20}
}

4、使用convertToMap转换为key=name,value=age格式的map

Map<String, Integer> map1 = CollectionKit.convertToMap(users, User::getName, User::getAge);
运行结果:
{
     李四=10,
     张三=25,
     王五=20
}

5、使用filter筛选年龄为10的用户

List<User> filter = CollectionKit.filter(users, item -> item.age == 10);
运行结果:[User{name='张三', age=10}, User{name='李四', age=10}]

6、使用distinct根据名字或年龄去重

List<User> distinct = CollectionKit.distinct(users, Comparator.comparing(o -> o.name));
List<User> distinct1 = CollectionKit.distinct(users, Comparator.comparing(o -> o.age));
运行结果:
[User{name='张三', age=10}, User{name='李四', age=10}, User{name='王五', age=20}]
[User{name='张三', age=10}, User{name='王五', age=20}, User{name='张三', age=25}]

7、使用group根据年龄分组

Map<Integer, List<User>> group = CollectionKit.group(users, User::getAge);
运行结果:
{
     20=[User{name='王五', age=20}],
     25=[User{name='张三', age=25}],
     10=[User{name='张三', age=10}, User{name='李四', age=10}]
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值