2016-06-16 8 views
1

時間とを加算し、私は値を使用したい状況で自分自身を見つけると同時に、コレクションに追加:流暢例えば、コレクション(値を追加し、返す)再び

List<String> names = new ArrayList<>(); 
person1.setName(addTo(names, "Peter")); 
person2.setName(addTo(names, "Karen")); 

(注:これはブール値を返すためjava.util.Collection.add(E)を使用すると、当然のことながら動作しません。)

確かに、それは自分が好きなユーティリティメソッドを記述するのは簡単です:

public static <E> E addTo(Collection<? super E> coll, E elem) { 
    coll.add(elem); 
    return elem; 
} 

本当にありますかJavaSE、Commons Collections、Guava、または他の "標準"ライブラリで既にこのようなものではありませんか?

+2

グアバは決してそのような "ヘルパー"を作っていません。多分、コモンズ。 – shmosel

+0

@shmosel:私は同意しますが、おそらくGuavaは別の形でそれを持つことができます。それらのFluentIterableに似た、ラッパーとして。 –

+0

同時に2つのことをしようとすると、悪いハビットとは考えられませんか? addToCollectionAndReturnValueというメソッドは私にはうってつけです。私はまた、あなたがなぜこの記事で解決策を書いたときにこのための「標準的な」ソリューションを探しているのか理解していません。 –

答えて

1

これは私にとって非常に奇妙なパターンのようです。 person1.setName(addTo(names, "Peter"))ような行が反転し、適切に解析することが非常に困難であるようだ。

既存の人物オブジェクトに名前が割り当てられ、その名前は、最初の名前のリストに追加され、名前は「ピーター」です。

(例えば)person1.setName("Peter"); names.add(person1.getName());であることコントラスト:

メイク「ピーター」既存のpersonオブジェクトの名前は、名前のリストにその名前を追加します。

私はそれが1つではなく2つのステートメントであることを認めていますが、それはあなたが提案している珍しいセマンティクスに比べて非常に低コストです。後者の書式設定は理解しやすく、リファクタリングが容易であり、より慣用的です。

addTo()メソッドの恩恵を受ける可能性のある多くのシナリオには別の問題があり、以前の別のリファクタリングでよりうまく役立つでしょう。その中核に


問題は、同時にそれらのオブジェクトの特定の面から成る無関係なリストを構築しながら、複雑なデータ型(Person)を表現するためにしようとしているということのようです。潜在的により簡単な(しかも流暢な)オプションは、Personオブジェクトのリストを作成し、そのリストを変換して必要な値を抽出することです。考えてみましょう:私たちは、もはや孤立person1person2変数を必要とし、peoplenames間のより直接的な関係は今あります

List<Person> people = ImmutableList.of(new Person("Peter"), new Person("Karen")); 
List<String> names = people.stream().map(Person::getName).collect(toList()); 

注意してください。 namesの必要性に応じて、2番目のリストを作成することを避けることができます。 List.forEach()である。

まだJava 8を使用していない場合は、Guava's functional utilitiesの機能構文を使用できます。そのページの警告は、Java-8の土地であっても価値があります。

2

あなたがEclipse Collectionsを使用する場合、以下は動作します:

MutableList<String> names = Lists.mutable.empty(); 
person1.setName(names.with("Peter").getLast()); 
person2.setName(names.with("Karen").getLast()); 

with方法はそうあなたが簡単に連鎖することができますするために追加されたコレクションを返しますがしたい場合は追加します。MutableListjava.util.Listを拡張)でwithを呼び出した後にgetLastを使用すると、追加したばかりの要素が得られます。

注:私はEclipse Collectionsのコミッターです。

関連する問題