行业资讯 2025年08月6日
0 收藏 0 点赞 543 浏览 5844 个字
摘要 :

文章目录 Collection 转化为 Map 使用样例 代码展示 Map格式转换 转换 Map 的 Value 测试样例 代码展示 集合类型转化 Collection 和 List、Set 的转化 测试样例 L……




  • Collection 转化为 Map
    • 使用样例
    • 代码展示
  • Map格式转换
  • 转换 Map 的 Value
    • 测试样例
    • 代码展示
  • 集合类型转化
  • Collection 和 List、Set 的转化
    • 测试样例
  • List、Set 类型之间的转换
    • 测试样例

    本文主要讲解关于10个lambda表达式实现集合相互转换的工具方法相关内容,该工具类方法可以帮助我们快速实现java中集合之间的相互转化,使用方便,分享出来让我们来一起学习下吧,看完后,估计你就可以精通lambda表达式啦!

    前公司的技术总监写了工具类,对Java Stream 进行二次封装,使用起来非常爽,全公司都在用。

    我自己照着写了一遍,改了名字,分享给大家。

    一共整理了10个工具方法,可以满足 Collection、List、Set、Map 之间各种类型转化。例如

    1. Collection<OrderItem> 转化为 List<OrderItem>
    2. Collection<OrderItem> 转化为 Set<OrderItem>
    3. List<OrderItem> 转化为 List<Long>
    4. Set<OrderItem> 转化为 Set<Long>
    5. Collection<OrderItem> 转化为 List<Long>
    6. Collection<OrderItem> 转化为 Set<Long>
    7. Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem
    8. Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
    9. Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
    10. value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }

    Collection 集合类型到 Map类型的转化。

    Collection 转化为 Map

    由于 List 和 Set 是 Collection 类型的子类,所以只需要实现Collection 类型转化为 Map 类型即可。
    Collection转化为 Map 共分两个方法

    1. Collection<OrderItem> Map<Key, OrderItem>,提取 Key, Map 的 Value 就是类型 OrderItem
    2. Collection<OrderItem>Map<Key,Value> ,提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。

    使用样例

    代码示例中把Set<OrderItem> 转化为 Map<Long, OrderItem>Map<Long ,Double>

    @Test
    public void testToMap() {
        Collection<OrderItem> collection = coll;
        Set<OrderItem> set = toSet(collection);
    
        Map<Long, OrderItem> map = toMap(set, OrderItem::getOrderId);
    }
    
    @Test
    public void testToMapV2() {
        Collection<OrderItem> collection = coll;
        Set<OrderItem> set = toSet(collection);
    
        Map<Long, Double> map = toMap(set, OrderItem::getOrderId, OrderItem::getActPrice);
    }
    

    代码展示

    public static <T, K> Map<K, T> toMap(Collection<T> collection, Function<? super T, ? extends K> keyMapper) {
        return toMap(collection, keyMapper, Function.identity());
    }
    
    public static <T, K, V> Map<K, V> toMap(Collection<T> collection,
                                            Function<? super T, ? extends K> keyFunction,
                                            Function<? super T, ? extends V> valueFunction) {
        return toMap(collection, keyFunction, valueFunction, pickSecond());
    }
    
    public static <T, K, V> Map<K, V> toMap(Collection<T> collection,
                                            Function<? super T, ? extends K> keyFunction,
                                            Function<? super T, ? extends V> valueFunction,
                                            BinaryOperator<V> mergeFunction) {
        if (CollectionUtils.isEmpty(collection)) {
            return new HashMap<>(0);
        }
    
        return collection.stream().collect(Collectors.toMap(keyFunction, valueFunction, mergeFunction));
    }
    
    public static <T> BinaryOperator<T> pickFirst() {
        return (k1, k2) -> k1;
    }
    public static <T> BinaryOperator<T> pickSecond() {
        return (k1, k2) -> k2;
    }
    

    Map格式转换

    转换 Map 的 Value

    1. 将 Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
    2. value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }。

    测试样例

    @Test
    public void testConvertValue() {
        Collection<OrderItem> collection = coll;
        Set<OrderItem> set = toSet(collection);
    
        Map<Long, OrderItem> map = toMap(set, OrderItem::getOrderId);
    
        Map<Long, Double> orderId2Price = convertMapValue(map, item -> item.getActPrice());
        Map<Long, String> orderId2Token = convertMapValue(map, (id, item) -> id + item.getName());
    
    }
    

    代码展示

    public static <K, V, C> Map<K, C> convertMapValue(Map<K, V> map, 
                            BiFunction<K, V, C> valueFunction,
                            BinaryOperator<C> mergeFunction) {
        if (isEmpty(map)) {
            return new HashMap<>();
        }
        return map.entrySet().stream().collect(Collectors.toMap(
                e -> e.getKey(),
                e -> valueFunction.apply(e.getKey(), e.getValue()),
                mergeFunction
        ));
    }
    
    public static <K, V, C> Map<K, C> convertMapValue(Map<K, V> originMap, BiFunction<K, V, C> valueConverter) {
        return convertMapValue(originMap, valueConverter, Lambdas.pickSecond());
    }
    
    public static <T> BinaryOperator<T> pickFirst() {
        return (k1, k2) -> k1;
    }
    public static <T> BinaryOperator<T> pickSecond() {
        return (k1, k2) -> k2;
    }
    

    集合类型转化

    Collection 和 List、Set 的转化

    1. Collection<OrderItem> 转化为 List<OrderItem>
    2. Collection<OrderItem> 转化为 Set<OrderItem>
    public static <T> List<T> toList(Collection<T> collection) {
        if (collection == null) {
            return new ArrayList<>();
        }
        if (collection instanceof List) {
            return (List<T>) collection;
        }
        return collection.stream().collect(Collectors.toList());
    }
    
    public static <T> Set<T> toSet(Collection<T> collection) {
        if (collection == null) {
            return new HashSet<>();
        }
        if (collection instanceof Set) {
            return (Set<T>) collection;
        }
        return collection.stream().collect(Collectors.toSet());
    }
    

    测试样例

    @Test//将集合 Collection 转化为 List
    public void testToList() {
        Collection<OrderItem> collection = coll;
        List<OrderItem> list = toList(coll);
    }
    
    @Test//将集合 Collection 转化为 Set
    public void testToSet() {
        Collection<OrderItem> collection = coll;
        Set<OrderItem> set = toSet(collection);
    }
    

    List和 Set 是 Collection 集合类型的子类,所以无需再转化。

    List、Set 类型之间的转换

    业务中有时候需要将 List<A> 转化为 List<B>。如何实现工具类呢?

    public static <T, R> List<R> map(List<T> collection, Function<T, R> mapper) {
        return collection.stream().map(mapper).collect(Collectors.toList());
    }
    
    public static <T, R> Set<R> map(Set<T> collection, Function<T, R> mapper) {
        return collection.stream().map(mapper).collect(Collectors.toSet());
    }
    
    public static <T, R> List<R> mapToList(Collection<T> collection, Function<T, R> mapper) {
        return collection.stream().map(mapper).collect(Collectors.toList());
    }
    
    public static <T, R> Set<R> mapToSet(Collection<T> collection, Function<T, R> mapper) {
        return collection.stream().map(mapper).collect(Collectors.toSet());
    }
    

    测试样例

    1. List<OrderItem> 转化为 List<Long>
    2. Set<OrderItem> 转化为 Set<Long>
    3. Collection<OrderItem> 转化为 List<Long>
    4. Collection<OrderItem> 转化为 Set<Long>
    @Test
    public void testMapToList() {
        Collection<OrderItem> collection = coll;
        List<OrderItem> list = toList(coll);
    
        List<Long> orderIdList = map(list, (item) -> item.getOrderId());
    }
    
    @Test
    public void testMapToSet() {
        Collection<OrderItem> collection = coll;
        Set<OrderItem> set = toSet(coll);
    
        Set<Long> orderIdSet = map(set, (item) -> item.getOrderId());
    }
    
    @Test
    public void testMapToList2() {
        Collection<OrderItem> collection = coll;
    
        List<Long> orderIdList = mapToList(collection, (item) -> item.getOrderId());
    }
    
    @Test
    public void testMapToSetV2() {
        Collection<OrderItem> collection = coll;
        
        Set<Long> orderIdSet = mapToSet(collection, (item) -> item.getOrderId());
    
    }
    

    总结一下 以上样例包含了如下的映射场景

    1. Collection<OrderItem> 转化为 List<OrderItem>
    2. Collection<OrderItem> 转化为 Set<OrderItem>
    3. List<OrderItem> 转化为 List<Long>
    4. Set<OrderItem> 转化为 Set<Long>
    5. Collection<OrderItem> 转化为 List<Long>
    6. Collection<OrderItem> 转化为 Set<Long>
    7. Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem
    8. Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
    9. Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
    10. value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }

    以上就是关于10个lambda表达式实现集合相互转换的工具方法相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客,学习愉快哦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/10159.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号