2017-10-10 4 views
3

文字列(郡)とオブジェクト(txcArray)の2つのリストストリームがあります。私は両方のリストを反復し、郡のインスタンスをtxcArrayのインスタンスと比較し、カウンタを増分して一致させる必要があります。私はこれをjava 8ラムダ式を使って行う必要があります。これは私がこれまで行ってきたことです。java 8ラムダ式を使用して2つのストリームを反復処理してカウントを行う方法

counties.stream().forEach(a-> { 
    txcArray.stream() 
      .filter(b->b.getCounty().equals(a)) 
      .map(Map<String,Integer>) 
}); 
+1

あなたは「2つのリスト」を持っていて、「2つのリストストリーム」を持っていないと思いますか?だからあなたの述語に関するオブジェクトの配列に一致する文字列のリスト内のアイテムの数を数えたいだけですか?もしそうなら: '.forEach'を忘れ、' .filter'と '.count()'を使って解決してください。それがうまくいけば、 '.map'を続けてフィルタリングする前にオブジェクトを国の文字列に変換することができます。最後に、メソッド参照を使用することもできます。あなたが解決しようとしているものの方が複雑なように、私はGrishaの 'zip'に関する提案から始めません。 – Roland

+0

質問をもう一度練習しましょう。私は型文字列とtexasCitiesClass(txcArray)型の別のlisのリストを持っています。 texasCitiesClassには、都市名、郡、および人口が含まれます。私は郡のリストのすべてのユニークな郡を持っています。私がする必要があるのは、txcArrayにcountiesの各インスタンスが何回現れているかをチェックし、各countyのこの数値を整数型またはlong型の別のリストに追加することです。制約は、ストリームとラムダ式を使ってこれを行うことになっているということです。あなたの助けをありがとう、グリッサとローランド –

答えて

5

あなたの間違いはforEachです。

List<Long> counts = counties.stream() 
    .map(a -> txcArray.stream().filter(b -> b.getCounty().equals(a)).count()) 
    .collect(Collectors.toList()); 

ただし、これはあまり効率的ではありません。counties.size() × txcArray.size()操作です。これは、リストが大きくなると簡単に手を抜くことができます。

それは単一のストリームの操作はありませんが、中間ストレージを使用しても、これは好ましく、従って、より大きなリストの方が効率的であろうcounties.size() + txcArray.size()操作を実行する

Map<String, Long> map = txcArray.stream() 
    .collect(Collectors.groupingBy(b -> b.getCounty(), Collectors.counting())); 
List<Long> counts = counties.stream() 
    .map(a -> map.getOrDefault(a, 0L)) 
    .collect(Collectors.toList()); 

を使用することをお勧めします。