Googleコレクションを使用するときに、いくつかのコレクション処理コードの簡略化について質問があります(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;
}
});
しかし、これはとてもエレガントで、読みやすいことは言うまでもありません。実際、(空想的なPredicateやFunctionのものがまったくない)プレーンな古いJavaコードは間違いなくはるかにクリーンです。
Collection<String> resourceIds = Lists.newArrayList();
for (Computer computer : matchingComputers) {
String resourceId = computer.getResourceId();
if (resourceId != null) {
resourceIds.add(resourceId);
}
}
上記を使用することも選択肢の1つですが、好奇心から(そしてGoogleコレクションについてもっと学びたいと考えています)、Googleコレクションを使用して、より簡潔でエレガントな方法でまったく同じことを実行できますか?
Predicates
ここに役立つ述語がすでにPredicates.notNull()
あります--これを使用Iterables.filter()
して、これをもう少しクリーンアップすることがLists.newArrayList()
できるという事実がIterable
あります。
Collection<String> resourceIds = Lists.newArrayList(
Iterables.filter(
Iterables.transform(matchingComputers, yourFunction),
Predicates.notNull()
)
);
実際にを必要としない場合はCollection
、だけを使用するIterable
と、Lists.newArrayList()
呼び出しもなくなるため、再び1ステップクリーンになります。
私はあなたががFunction
再び便利になると思うかもしれないと思うかもしれません、そして
public class Computer {
// ...
public static Function<Computer, String> TO_ID = ...;
}
これによりさらにクリーンアップされます(再利用が促進されます)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加