2016-05-02 19 views
4

Java 8ストリームを使用してリスト内の値セットにオブジェクトの数を取得しようとしていますが、まだそれを取得できません。Java 8ストリーム:カウント値

これは私が何をしようとしていますものです:

int threshold = 5; 
for (Player player : match) { // match is a Set<Player> 
    int count = 0; 
    for (Set<Player> existingMatch : matches) 
     if (existingMatch.contains(player)) 
      count++; 
    if (count >= threshold) 
     throw new IllegalArgumentException("..."); 
} 

私はcollectgroupingByでグループをすることができ、かつ適用する操作は、新しいメソッド参照演算子でcontainsであることを言って、フィルタを使用し知っています。しかし、私はまだこれらの新しいJava 8の機能ではまだグリーンであり、すべてをまとめることはできません。

したがって、playerの数字をにすべて抽出することができます。の値のリストは、Stream?

+4

Iドン投稿されたコードに地図が表示されません。なぜストリームベースの同等物で地図を使用するのですか? –

+1

あなたがここで何を達成しようとしているのかは不明です。そのような地図の例とそれを得るために得ようとしている出力を共有できますか? – Mureinik

答えて

6

ラムダ式は、論理の異なるビットを分離し、それらを一緒に構成するのに役立ちます。

あなたのコードからわかるように、少なくともthresholdの要素がmatchesに含まれているかどうかをテストしています。次のように私たちは、テストロジックを記述することができます。

Predicate<Player> illegalTest = player -> matches.stream() 
     .filter(m -> m.contains(player)) 
     .count() >= threshold; 

をその後、我々はプレイヤーのいずれかが一致するかどうかを確認するために、このテストを適用する:

boolean hasIllegal = match.stream().anyMatch(illegalTest); 

そして最後に:

if (hasIllegal) { 
    throw new IllegalArgumentException("..."); 
} 
+4

フィルターの後ろに 'limit(threshold)'を置いたほうが効率的でしょう。 –

+1

@JBNizet私はそれを入れるかどうか議論しましたが、それを簡単に保つことに決めました。 – Misha

関連する問題