2016-04-05 20 views
6

有効なJava 2nd Edによると、varargsを許可するメソッドシグネチャを書きたいが、コンパイル時に最低限の要素しか持たないようにするには、このようにメソッドシグネチャを記述する必要があります私は1のストリームを作成しています、特にので、Java 8ストリームとvarargs

public void something(String required, String ... additional) { 
    Stream<String> allParams = 
     Stream.concat(Stream.of(required), Stream.of(additional)); 
    //... do what you want to do 
} 

これは本当に洗練無駄な感じ:私はこれらすべての要素をストリーミングする場合は

public void something(String required, String ... additional) { 
    //... do what you want to do 
} 

、私はこのような何かをやってきましたおよびconcatenaそれを別のものにつないでください。これを行うためのよりクリーンな方法がありますか?

+5

'Stream.concat'は、私には罰金です。..短くて簡潔ですが、データのコピーを作成しません。あなたはいくつかの追加のラッパーオブジェクトを作成しています。それだけです。 IMOは本当に間違っています。 Javaでプログラミングするには、ちょっとした物を作る必要があります。 'Stream.concat'は' ArrayList'などでそれらをマージするよりもずっと前です。 – Radiodef

+1

私はRadiodefに同意します。もし実際にあなたがSpliterator 'の独自の実装を行い、' StreamSupport.stream(spliterator、parallel) 'と一緒に使うことができたら、それはもっと読みやすく効率的になります。 –

答えて

6

これは2つのファイルを作成せずにファイルを作成する方法ですが、好きではないかもしれませんがStreamsです。

Stream.Builder<String> builder = Stream.<String>builder().add(required); 
for (String s : additional) { 
    builder.add(s); 
} 

Stream<String> allParams = builder.build(); 
+0

また、forループを 'Stream.of(additional).forEach(builder);に置き換えることもできます。 –

+0

これを再訪してコメントに基づいて、私の元の方法は問題ないようです。しかし、私の前の見解では、この答えが最良の選択肢だと思われます。ありがとう:) –

1

あなたはグアバを使用するために喜んでいる場合、あなたはありLists.asList(required, additional).stream()。この方法は、最小要件イディオムでその可変範囲を緩和するために作成されました。

私はライブラリが本当に便利だと考えていますが、それだけでそれを追加するのは良い考えではありません。 docsを確認して、それがあなたにもっと役立つかどうか確認してください。

2

残念ながら、Javaは非常に冗長です。しかし、それを軽減する別の選択肢は、単純に静的なインポートを使用することです。私の意見では、すべてのメソッドがストリームに関連しているので、コードをあまり明確にしません。

Stream<String> allParams = 
    concat(of(required), of(additional)); 
1

作成されたストリームに問題はありません。これらのオブジェクトはソースデータのみを参照するため、軽量ですが、配列の内容のようなデータはコピーしません。このような軽量オブジェクトのコストは、実際のペイロードが非常に小さい場合にのみ関連します。このようなシナリオは、特殊な、意味的に同等のオーバーロードで扱うことができます。

public void something(String required, String ... additional) { 
    somethingImpl(Stream.concat(Stream.of(required), Stream.of(additional))); 
} 
public void something(String required) { 
    somethingImpl(Stream.of(required)); 
} 
public void something(String required, String second) { 
    somethingImpl(Stream.of(required, second)); 
} 
private void somethingImpl(Stream<String> allParams) { 
    //... do what you want to do 
} 

ので、あなただけのStreamインスタンスだけでなく、(Stream.ofの過負荷に類似)可変引数配列を保存していない唯一の引数の場合。これは一般的なパターンです。例えば、EnumSet.ofのオーバーロードを参照してください。

しかし、多くの場合、これらの単純なオーバーロードさえ必要ではなく、未熟な最適化と見なすこともできます(アプリケーション開発者が必要に応じて追加することは不可能です)。 somethingがライブラリではなくアプリケーションの一部である場合、プロファイラがそのパラメータ処理によってボトルネックがあることを通知しない限り、追加しないでください。私のStreamExまたはjOOλのようなAPIをストリームに

1

サードパーティの拡張機能を使用すると、よりきれいな方法でこれを行うことができappendまたはprependのようなメソッドを提供します。

// Using StreamEx 
Stream<String> allParams = StreamEx.of(required).append(additional); 
// Using jOOL 
Stream<String> allParams = Seq.of(required).append(additional); 
関連する問題