Googleコレクション(アップデート:Guava)を使用しているときに、コレクション処理コードの簡素化について質問があります。Guavaを使用してコレクションを変換する際に、nullを削除するエレガントな方法はありますか?
「コンピュータ」オブジェクトがたくさんあり、「リソース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コレクションからヌルを省略したいと思います:これはそうのように行われます。あなたはこのように一緒にすべてのことを置くことができ
Collections2.filter(resourceIds, new Predicate<String>() {
@Override
public boolean apply(String input) {
return input != null;
}
});
:
は、ここで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コードは間違いなく非常にクリーン次のようになります。上記を使用して
Collection<String> resourceIds = Lists.newArrayList();
for (Computer computer : matchingComputers) {
String resourceId = computer.getResourceId();
if (resourceId != null) {
resourceIds.add(resourceId);
}
}
も確かにオプションですが、好奇心(と多くを学ぶための意欲のうちGoogleコレクションのを使用すると、より短くて洗練された方法で同じことをすることができますか?
ニース - なぜ私はその前にPredicatesメソッドを見つけたことがないのか分かりません... –
優れたアドバイス、ありがとうございます! Predicates.notNull()を使用して関数を定数に入れると、実際にはコードがかなり明確になります。 – Jonik
素晴らしい:)。私は変換としてフォントを使用するとき、私は静的メソッドでそれを分離し、それをXXX()に命名するのが好きです。読みやすいと思います。この場合、次のようになります。transform(matchingCompters、intoResourceId())。 –