2016-09-14 3 views
2

以下は、コンパイル時に期待通りに機能しないコードスニペットです。Javaストリームを使用したコレクションからの最小値と最大値の検索

私が本当にやりたいことは、ストリームを使ってすべてのリストからminとmaxを見つけることです。

public class Delete { 

    public static void main(String[] args) { 

     List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 677, 0); 
     List<Integer> list1 = Arrays.asList(11, 12, 23, 34, 25, 77); 
     List<Integer> list2 = Arrays.asList(12, 21, 30, 14, 25, 67); 
     List<Integer> list3 = Arrays.asList(41, 25, 37, 84, 95, 7); 

     List<List<Integer>> largeList = Arrays.asList(list, list1, list2, list3); 

     System.out.println(largeList.stream().max(Integer::compare).get()); 
     System.out.println(largeList.stream().min(Integer::compare).get()); 
    } 

} 
+0

を見るhttp://stackoverflow.com/questions/25988707/find-max-min-sum-and-average-of-a -list/25988761#25988761(重複は可能ですが、 'flatMap'部分はありません) –

+0

' flatMap'については、http://stackoverflow.com/questions/25147094/turn-a-list-of-lists-into-を参照してください。 a-list-using-lambdas – Tunaki

答えて

8

あなたはあなたのコードが動作するためには、単一のStream<Integer>にすべてのList Sの要素を平らにする必要があります。

System.out.println(largeList.stream().flatMap(List::stream).max(Integer::compare).get()); 
System.out.println(largeList.stream().flatMap(List::stream).min(Integer::compare).get()); 

これではありませんあなたはListを2度処理してminmaxの両方を見つけることができるので、非常に効率的ですIntStream::summaryStatistics()を使用して、単一の処理で同じデータ(およびそれ以上):

IntSummaryStatistics stats = largeList.stream(). 
             .flatMap(List::stream) 
             .mapToInt(Integer::intValue) 
             .summaryStatistics(); 
System.out.println(stats.getMin()); 
System.out.println(stats.getMax()); 
+0

編集内容を元に戻す必要があります。 –

+2

'IntSummaryStatistics'です。そのクラスについては決して知らなかった。 +1 – Jatin

+0

Thnx。私は編集中にあなたの答えを混乱させたと思った。それはピアレビューアのメモでした。 Urの答えは本当に役に立ちました。 –

2

これを試してみてください:

largeList.stream().flatMap(List::stream).max(Integer::compare).get(); 
関連する問題