0

私は、頻繁ではなく時々必要になるコードを書いていましたが、なぜこれほど多くのコード行が必要なのか疑問に思っていました。別のコレクションのオブジェクトのメソッドから返された文字列を使用して、新しいコレクションを作成する必要がありました。そのクラスの 3 つの異なるメソッドでこれを 3 回行う場合があります。グアバには私を助ける何かがあるかもしれないと思いました。何かのようなもの:

collection = Iterators.collectNotNull( myCollection, new Function...{
    public String apply( MyObject input ) {
        String value = input.getStringValue();
        if ( StringUtils.isEmpty( value )
            return null;
        return value; } );

つまり、私にとってはコード行が多すぎるということです。しかし、どちらにしても、基本的には必要なときに上記を書きました。

問題は、より少ないコードでこれをもっと簡単にできる人がいるでしょうか? Apache commons や Guava などの既存のメインストリーム ライブラリを使用できます。値を返すメソッドを取得するために匿名の内部を作成する必要をなくしたい場合は、リフレクションで問題ありません。上記は私の最善の試みですが、再利用可能な「collectNotNull」メソッドを作成する必要がありました。私はする必要がない方がいいです。

4

3 に答える 3

3

目的がコードの数が少ない場合は、明白なアプローチが最適です。

 List<String> list = Lists.newArrayList();
 for (MyObject input : myCollection) {
   String value = input.getStringValue();
   if (!value.isEmpty()) {
     list.add(value);
   }
 }

機能的なイディオムについては、Guavawikiページを参照してください。通常はやり過ぎです。

于 2012-12-21T17:53:18.683 に答える
0

Java に高階関数があれば…</p>

まあ、その道を下らないようにしましょう。

Java でこれに近づく 1 つの方法は、foreachライブラリを使用することです。

for (Collect<Type> each: ForEach.collect(input)) 
    each.yield = each.value.method(); 
for (Reject<String> each: ForEach.reject(ForEach.result())) 
    each.yield = each.value.isEmpty(); 
result = ForEach.result()
于 2012-12-22T01:38:37.270 に答える