10个实现Java集合,Map类型自由转换的实用工具方法

 更新时间:2023年09月11日 10:33:35   作者:他是程序员  
这篇文章主要为大家整理了整理了10个实用工具方法,可以满足 Collection、List、Set、Map 之间各种类型转化,文中的示例代码讲解详细,需要的可以参考下

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

  • Collection<OrderItem> 转化为 List<OrderItem>
  • Collection<OrderItem> 转化为 Set<OrderItem>
  • List<OrderItem> 转化为 List<Long>
  • Set<OrderItem> 转化为 Set<Long>
  • Collection<OrderItem> 转化为 List<Long>
  • Collection<OrderItem> 转化为 Set<Long>
  • Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem
  • Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
  • Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
  • value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }

集合类型转化

Collection 和 List、Set 的转化

  • Collection<OrderItem> 转化为 List<OrderItem>
  • 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());
}

测试样例

  • List<OrderItem> 转化为 List<Long>
  • Set<OrderItem> 转化为 Set<Long>
  • Collection<OrderItem> 转化为 List<Long>
  • 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());
}

接下来看 Collection 集合类型到 Map类型的转化。

Collection 转化为 Map

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

  • Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem
  • Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
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, pickLast());
}
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));
}

使用样例

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

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

Map格式转换

转换 Map 的 Value

  • 将 Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
  • value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }。
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> convertValue(Map<K, V> originMap, BiFunction<K, V, C> valueConverter) {
    return convertValue(originMap, valueConverter, Lambdas.pickLast());
}
public static <T> BinaryOperator<T> pickFirst() {
    return (k1, k2) -> k1;
}
public static <T> BinaryOperator<T> pickSecond() {
    return (k1, k2) -> k2;
}

测试样例

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

总结

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

  • Collection<OrderItem> 转化为 List<OrderItem>
  • Collection<OrderItem> 转化为 Set<OrderItem>
  • List<OrderItem> 转化为 List<Long>
  • Set<OrderItem> 转化为 Set<Long>
  • Collection<OrderItem> 转化为 List<Long>
  • Collection<OrderItem> 转化为 Set<Long>
  • Collection<OrderItem>中提取 Key, Map 的 Value 就是类型 OrderItem
  • Collection<OrderItem>中提取 Key, Map 的 Value 根据 OrderItem 类型进行转化。
  • Map<Long, OrderItem> 中的value 转化为 Map<Long, Double>
  • value 转化时,lamada表达式可以使用(v)->{}, 也可以使用 (k,v)->{ }

以上就是10个实现Java集合,Map类型自由转换的实用工具方法的详细内容,更多关于Java类型转换的资料请关注脚本之家其它相关文章!

相关文章

  • Java面向对象之多态

    Java面向对象之多态

    这篇文章主要介绍了Java面向对象之多态,文章以什么是多态、多态的实现条件、多态的访问特点、多态的优点和缺点的相关资料展开文章内容,需要的小伙伴可以参考一下
    2021-10-10
  • Java实现直接插入排序与折半插入排序的示例详解

    Java实现直接插入排序与折半插入排序的示例详解

    这篇文章主要为大家详细介绍了插入排序中两个常见的排序:直接插入排序与折半插入排序。本文用Java语言实现了这两个排序算法,感兴趣的可以学习一下
    2022-06-06
  • springboot starter自定义实现公共模块方式

    springboot starter自定义实现公共模块方式

    这篇文章主要介绍了springboot starter自定义实现公共模块方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java中Websocket的使用方法例子

    java中Websocket的使用方法例子

    这篇文章主要给大家介绍了关于java中Websocket的使用方法,WebSocket是HTML5开始提供的一种在浏览器和服务器间进行全双工通信的协议,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Java基本数据类型和运算符详解

    Java基本数据类型和运算符详解

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2020-02-02
  • SpringBoot Test 多线程报错的根本原因(dataSource already closed)

    SpringBoot Test 多线程报错的根本原因(dataSource already

    在使用Springboot test进行相关测试的时候,发现开启线程操作数据库的时候异常,这篇文章主要介绍了SpringBoot Test 多线程报错:dataSource already closed的根本原因及解决方法,需要的朋友可以参考下
    2022-06-06
  • Struts2之Action接收请求参数和拦截器详解

    Struts2之Action接收请求参数和拦截器详解

    这篇文章主要介绍了Struts2之Action接收请求参数和拦截器详解,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • Java文件(io)编程_文件字节流的使用方法

    Java文件(io)编程_文件字节流的使用方法

    下面小编就为大家带来一篇Java文件(io)编程_文件字节流的使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java实现AES加密算法的简单示例分享

    Java实现AES加密算法的简单示例分享

    这篇文章主要介绍了Java实现AES加密算法的简单示例分享,AES算法是基于对密码值的置换和替代,需要的朋友可以参考下
    2016-04-04
  • Spring中的@ResponseStatus使用

    Spring中的@ResponseStatus使用

    这篇文章主要介绍了Spring中的@ResponseStatus使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论