guava:java:java.util.Map和java.util.Set的Key类型转换

昨天写了一博客《java:java.util.Map和java.util.Set的Key类型转换》,主要是想实现以java.util.MapKey类型转换,今天有空有研究了一下guava的代码,发现基于guava提供的API也是可以实现Key类型转换的: 关键就是Maps提供了uniqueIndex方法,可以将Map转换成Key不同的Map。

package net.gdface.facelog;

import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.junit.Test;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterators;
import com.google.common.collect.Maps;
import com.google.common.collect.Maps.EntryTransformer;

public class TestTransform {
    /** 
     * convert {@code Map<K1,V>} to {@code Map<K2,V>}   
     * @return {@linkplain ImmutableMap}
     */
    public static final <K1,K2,V>Map<K2,V> transform(Map<K1,V>fromMap,final Function<K1,K2>transformer){
        checkNotNull(fromMap,"fromMap is null");
        checkNotNull(transformer,"transformer is null");
        // 新的Map对象Key类型已经是K2了,只是Value类型成了Entry
        ImmutableMap<K2, Entry<K1, V>> k2Entry = Maps.uniqueIndex(fromMap.entrySet(), new Function<Entry<K1, V>,K2>(){
            @Override
            public K2 apply(Entry<K1, V> input) {               
                return transformer.apply(input.getKey());
            }});
        // 再做一次转换将Entry<K1, V>转换成V,这个过程并没有创建新的Map,只是创建了k2Entry的代理对象
        Map<K2, V> k2V = Maps.transformEntries(k2Entry, new EntryTransformer<K2,Entry<K1,V>,V>(){
            @Override
            public V transformEntry(K2 key, Entry<K1, V> value) {
                return value.getValue();
            }});
        return k2V;
    }
    /** 
     * convert {@code Set<E1>} to {@code Set<E2>}
     * @return {@link ImmutableSet} 
     */
    public static final <E1,E2>Set<E2> transform(final Set<E1>fromSet,final Function<E1,E2>transformer){
        checkNotNull(fromSet,"fromMap is null");
        checkNotNull(transformer,"transformer is null");
        return ImmutableSet.copyOf(Iterators.transform(fromSet.iterator(), transformer));
    }
    @Test
    public void test() {
        Map<String, String> m1 = Maps.<String,String>newLinkedHashMap();
        m1.put("1", "apple");
        m1.put("2", "orangle");
        m1.put("3", "banana");
        System.out.println(m1);
        Map<Integer, String> m2 = transform(m1, new Function<String,Integer>(){

            @Override
            public Integer apply(String input) {
                return Integer.valueOf(input);
            }});
        System.out.println(m2.toString());
    }

}

注意: 这个方法相比上篇博客中的方法要简单的多但是有区别的: 返回的Map对象是一个新的对象,与原Map对象没有任何关联,并且是不可变的(immutable)。 而上一篇博客中的方法返回的Map对象则是原对象的代理对象,并且是可变的(mutable),对新对象的任何操作实际都是对原对象的操作。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰同学骚年

C#基础与常用数据结构学习笔记

  接口相当于没有方法实现的抽象类,接口方法不要加各种访问级别:例如public,private等。

803
来自专栏大内老A

为什么System.Attribute的GetHashCode方法需要如此设计?

昨天我在实现《通过扩展改善ASP.NET MVC的验证机制[使用篇]》的时候为了Attribute 的一个小问题后耗费了大半天的精力,虽然最终找到了问题的症结并...

16910
来自专栏技术博客

C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)

   IEnumerable、IEnumerator到现在为止对这两个接口还是不太理解,不理解但是自己总是想着试着要搞明白,毕竟自己用的少,所以在此先记录一下。...

832
来自专栏有趣的Python

4-Java常用工具类-集合

问题: 存储20名学生的学生信息。20是不变的,就是这么多。 问题: 存储商品信息。不知道自己要买多少商品。

642
来自专栏Java帮帮-微信公众号-技术文章全总结

04-01.总结switch,for,while,do。while跳转语句

1:switch语句(掌握) (1)格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; ...

3255
来自专栏风口上的猪的文章

.NET面试题系列[9] - IEnumerable

IEnumerable及IEnumerable的泛型版本IEnumerable<T>是一个接口,它只含有一个方法GetEnumerator。Enumerable...

782
来自专栏Java帮帮-微信公众号-技术文章全总结

第十九天 集合-Map接口容器工具类集合框架总结【悟空教程】

Map集合的特点,如是否可重复,是否有序仅作用在键上,如HashMap集合的键不得重复,值可以重复。

1123
来自专栏java一日一条

Java 容器 & 泛型(2):ArrayList 、LinkedList和Vector比较

序列(List),有序的Collection,正如它的名字一样,是一个有序的元素列表。确切的讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和...

451
来自专栏程序生活

Leetcode-Easy 461.Hamming Distance

Leetcode-Easy是Leecode难度为"Easy"的解法,由python编码实现。 461.Hamming Distance 描述: ? 思路: 首...

2665
来自专栏苦逼的码农

从0打卡leetcode之day9--字符串转整型

好久没更新了,今天是开学的第一天,这学期选了门算法的课,打算好好刷下《算法导论》这本书,可能接下来会一边分享leetcode的刷题贴,一边分享自己在书上所学的一...

603

扫码关注云+社区