说我有像
这样的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
的对象的成员
答案 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));