List
)转换成一个映射(Map
),使用列表元素的属性之一进行转换:
简单来说,它看起来像这样:
private Map<String, List<Diagnostic<? extends JavaFileObject>>> toMap( List<Diagnostic<? extends JavaFileObject>> diagnostics ) {
Map<String, List<Diagnostic<? extends JavaFileObject>>> result = new HashMap<String, List<Diagnostic<? extends JavaFileObject>>>();
for ( Diagnostic<? extends JavaFileObject> d : diagnostics ) {
List<Diagnostic<? extends JavaFileObject>> list = null;
if ( !result.containsKey( d.getCode() ) ) {
list = new ArrayList<Diagnostic<? extends JavaFileObject>>();
result.put( d.getCode(), list );
} else {
list = result.get( d.getCode() );
}
assert list != null;
list.add( d );
}
return result;
}
呀啊!...
我非常喜欢泛型,之前我使用的是Java,在使用泛型之前,我不想回到“强制转换一切”的时代,但是当一个泛型包含一个泛型元素时,事情变得混乱了。
我知道在Java1.7中我们将能够使用“钻石”运算符,但应该还有另一种方法。
这是非泛型版本的样子:
private Map toMap( List diagnostics ) {
Map result = new HashMap();
for( Object o : diagnostics ) {
Diagnostic d = ( Diagnostic ) o;
List list = null;
if( !result.containsKey( d.getCode() ) ) {
list = new ArrayList();
result.put( d.getCode() , list );
} else {
list = result.get( d.getCode() );
}
assert list != null;
list.add( d );
}
return result;
}
大致上,我并没有尝试编译它。
其他语言是如何处理的?例如C#、Scala?我非常喜欢SML或Haskell的处理方式,但有些时候过多的“魔法”可能会有害(当然这是主观的)。
有没有解决办法呢?
val
的方法吗?(http://projectlombok.org/features/val.html)虽然不能完全解决问题,但可以缩减代码。C#中的`var`提供了类似的解决方案。 - Adrian Cox<? extends JavaFileObject>
,我稍后会用到它。 - OscarRyz