2016-09-14 44 views
2

以下是代碼段,如預期的那樣,它在編譯時失敗。使用Java流查找集合中的最小和最大數字

我真正想做的是從所有使用流的列表中找到最小值和最大值。

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

你必須壓平所有的List S的成單Stream<Integer>的元素,以便您的代碼工作:

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 s兩​​次以便找到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。我想我在編輯時弄錯了你的答案。這是對同行評論者的一個提示。烏爾的回答確實有幫助。 –

2

試試這個:

largeList.stream().flatMap(List::stream).max(Integer::compare).get();