2016-11-16 5 views
3

リストの最初の要素に対して特定の操作を実行し、残りの要素すべてに対して異なる操作を実行します。ここでJava8ストリーミングを使用してリストの最初の要素に対して特定の操作を実行する

は私のコードスニペットです:

List<String> tokens = getDummyList(); 
if (!tokens.isEmpty()) { 
    System.out.println("this is first token:" + tokens.get(0)); 
} 
tokens.stream().skip(1).forEach(token -> { 
    System.out.println(token); 
}); 

は、好ましくは、javaの8ストリーミングAPIを使用して、これを達成するために任意のよりクリーンな方法はあります。

+0

:) – TheLostMind

+1

私は防ぐことだろう一つのこと:

あなたがしたいすべてがforEachのようなアクションを適用している場合は、あなたもIteratorを使用することができますNPEは 'トークン'がヌルであることも確認しています – TheLostMind

+0

はい、質問を説明するためのダミーコードです。私はストリーミングコール内の条件を合併していくつかの回線数を減らす方法があるかどうか疑問に思っていました。 –

答えて

3

この意図を表現する

items.stream().limit(1).forEach(v -> System.out.println("first: "+ v)); 
    items.stream().skip(1).forEach(System.out::println); 
+0

またはfindFirst() –

4

一つの方法は、

Spliterator<String> sp = getDummyList().spliterator(); 
if(sp.tryAdvance(token -> System.out.println("this is first token: "+token))) { 
    StreamSupport.stream(sp, false).forEach(System.out::println); 
} 
任意 Collection Sで動作

だけでなくList Sであり、潜在的に、より効率的な場合skipベースのソリューションよりもクリーンであろうより高度なStream操作がチェーンされています。このパターンは、Streamソースにも適用できます。つまり、複数のトラバーサルが不可能であったり、異なる結果になる可能性がある場合です。

Spliterator<String> sp=getDummyList().stream().filter(s -> !s.isEmpty()).spliterator(); 
if(sp.tryAdvance(token -> System.out.println("this is first non-empty token: "+token))) { 
    StreamSupport.stream(sp, false).map(String::toUpperCase).forEach(System.out::println); 
} 

しかし、最初の要素の特別な治療はまだ平等にすべてのストリーム要素の処理に比べて、パフォーマンスの低下を引き起こす可能性があります。私はあなたのアプローチはすでにクリーンかつ簡潔であることを考える

Iterator<String> tokens = getDummyList().iterator(); 
if(tokens.hasNext()) 
    System.out.println("this is first token:" + tokens.next()); 
tokens.forEachRemaining(System.out::println); 
+0

イテレータは受け入れられる解決策IMHOである必要があります。 +1 – Eugene

関連する問題