如何使用番石榴仿制药转换此地图?

时间:2014-04-30 15:13:30

标签: java guava

说我有像

这样的java类
public static class A{
        int a;
        int b;
        int c;
        public A(int a, int b, int c){
            this.a=a; this.b=b; this.c=c;
        }
    }
    public static void main(String[] args) {
        final Map<String, A> map =Maps.newHashMap();

        map.put("obj1",new A(1,1,1));
        map.put("obj2",new A(1,2,1));
        map.put("obj3",new A(1,3,1));

        Map<String,Integer> res = Maps.newHashMap();
        for(final String s : map.keySet()){
            res.put(s,map.get(s).b);
        }

    }
}

我如何获得res using generic guava`实用程序?

更一般地说,我希望能够从Map<U,V> Map<U,V'>获取V'类型的值将成为类V的对象的成员

2 个答案:

答案 0 :(得分:2)

你可以像这样简单地做到这一点。

Function<A, Integer> extractBFromA = new Function<A, Integer>() {
  @Override public Integer apply(A input) {
    return input.b;
  }
}
...
Map<String,Integer> res = Maps.transformValues(map, extractBFromA);

或者,没有可重用性:

Map<String,Integer> res = Maps.transformValues(map, new Function<A,Integer>() {
  @Override public Integer apply(A input) {
    return input.b;
  }
});

注意:结果是初始地图上的视图。您可能希望将其存储在新的HashMap(或ImmutableMap或任何其他Map)中。

答案 1 :(得分:0)

请注意,使用Java 8时,这会变得太多更少噪音。番石榴示例:

Map<String, Integer> res = Maps.transformValues(map, v -> v.b);

使用Java 8,你根本不需要番石榴。只需使用标准流方法:

Map<String, Integer> res = map.entrySet().stream()
    .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().b));

使用静态导入它甚至更短:

import static java.util.stream.Collectors.toMap;

// ...

Map<String, Integer> res = map.entrySet().stream()
    .collect(toMap(e -> e.getKey(), e -> e.getValue().b));