2016-11-09 48 views
7

我很感興趣從流中排序列表。這是我正在使用的代碼:在Java中使用stream.sorted()對列表進行排序

list.stream() 
    .sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue())) 
    .collect(Collectors.toList()); 

我錯過了什麼嗎?該列表不排序。

它應根據具有最低值的項目對列表進行排序。

for (int i = 0; i < list.size(); i++) 
{ 
    System.out.println("list " + (i+1)); 
    print(list, i); 
} 

和打印方法:

public static void print(List<List> list, int i) 
{ 
    System.out.println(list.get(i).getItem().getValue()); 
} 

回答

26

這不像Collections.sort()其中參數引用得到排序。在這種情況下,你只得到你需要收集和分配給另一個變量最終排序的流:

List result = list.stream().sorted((o1, o2)->o1.getItem().getValue(). 
            compareTo(o2.getItem().getValue())). 
            collect(Collectors.toList()); 

你剛好錯過分配結果:)

0

這似乎是做工精細:

List<BigDecimal> list = Arrays.asList(new BigDecimal("24.455"), new BigDecimal("23.455"), new BigDecimal("28.455"), new BigDecimal("20.455")); 
System.out.println("Unsorted list: " + list); 
final List<BigDecimal> sortedList = list.stream().sorted((o1, o2) -> o1.compareTo(o2)).collect(Collectors.toList()); 
System.out.println("Sorted list: " + sortedList); 

例輸入/輸出

Unsorted list: [24.455, 23.455, 28.455, 20.455] 
Sorted list: [20.455, 23.455, 24.455, 28.455] 

確定您不驗證列表而不是sortedList [在上例中],即您將stream()的結果存儲在新的List對象中,並驗證該對象?

3

使用list.sort代替:

list.sort((o1, o2) -> o1.getItem().getValue().compareTo(o2.getItem().getValue())); 

甚至更​​好的使用Comparator.comparing

list.sort(Comparator.comparing(o -> o.getItem().getValue())); 

其中之一,list本身將被排序。

你的問題是, list.stream.sorted回報排序的數據,它不到位是你希望進行排序。