Google Collections ( update : Guava )を使用するときに、一部のコレクション処理コードを簡素化することについて質問があります。
「コンピューター」オブジェクトがたくさんあるので、それらの「リソース ID」のコレクションを作成したいと考えています。これは次のように行われます。
Collection<Computer> matchingComputers = findComputers();
Collection<String> resourceIds =
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
public String apply(Computer from) {
return from.getResourceId();
}
}));
現在、getResourceId()
null を返す可能性があります (現在、それを変更することはできません) が、この場合、結果の String コレクションから null を省略したいと考えています。
null を除外する 1 つの方法を次に示します。
Collections2.filter(resourceIds, new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null;
}
});
すべてを次のようにまとめることができます。
Collection<String> resourceIds = Collections2.filter(
Lists.newArrayList(Iterables.transform(matchingComputers, new Function<Computer, String>() {
public String apply(Computer from) {
return from.getResourceId();
}
})), new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null;
}
});
しかし、このような単純なタスクの場合、これはエレガントではなく、読みやすさは言うまでもありません! 実際、単純な古い Java コード (派手な Predicate や Function をまったく使用していない) は、ほぼ間違いなく、はるかにクリーンになります。
Collection<String> resourceIds = Lists.newArrayList();
for (Computer computer : matchingComputers) {
String resourceId = computer.getResourceId();
if (resourceId != null) {
resourceIds.add(resourceId);
}
}
上記を使用することも確かにオプションですが、好奇心 (および Google Collections についてもっと学びたいという欲求) から、Google Collectionsを使用して、より短い方法またはよりエレガントな方法でまったく同じことを行うことができますか?