2016-11-29 6 views
-2

私はこのようなリストを持っている:結果はループ以外となるように"string"を含むリストの行数をカウントするには?

["hi","hello","one"] 
["hi","hello1","two"] 
["hi1","hello3","three"] 

は、文字列と行の数をカウントするためのより効率的な方法は、それに「こんにちは」はありますか? listCount()のようなコマンド?それでもストリームを使用することができ、あなたの代わりに配列を入れ子にしている場合は

List<List<String>> strings = asList(asList("hi", "hello", "one"), 
            asList("hi", "hello1", "two"), 
            asList("hi1", "hello3", "three")); 

:あなたはこのようなstrings変数を持っていると仮定すると...

long count = strings.stream() 
        .flatMap(List::stream) 
        .filter(Predicate.isEqual("hi")) 
        .count(); 

+0

どの方法を使用しても、内部的にループがあります。 – Maroun

+0

ストリームjava 8はそれを行うことができます – Jerry06

+0

私にサンプルコードを教えてもらえますか? – jaybee

答えて

3

は、Java 8のストリームを使用することができます上記のコードを調整する必要があります。

リストが大きい場合は、strings.stream()の代わりにstrings.parallelStream()でストリームを開始することで、より速く処理できます。利用可能なコアが並列処理に使用されていることが確認されます。

+0

ストリームが使用するループの回数はいくつですか? flatMapはたぶん1回だけ繰り返すでしょう、フィルターも...隠されていても、これはまだ2つのループです – AxelH

+0

@AxelH:今あなたは推測しています。ストリームは処理パイプラインを構築し、データを一度トラバースします。このストリームより複雑なストリームの場合、短絡や怠惰などの最適化が使用されます。並列ストリームを使用する場合、マルチコアCPUを利用することもできます。 –

+0

ちょっと質問しています...ストリームのソリューションはどこにでも見えています。コメント欄に答えがあることを知ってください! – AxelH

関連する問題