Stream có như sorted
phương pháp mà chấp nhận một so sánh do đó bạn có thể trực tiếp sử dụng so sánh như (x,y)->y.getKey().compareTo(x.getKey())
cho giảm dần phân loại. Để sắp xếp các đồ tăng dần chúng ta có thể đảo ngược thứ tự như (x,y)->x.getKey().compareTo(y.getKey())
cho việc củng cố kết quả trở lại vào LinkedHashMap chúng ta có thể sử dụng thu gom toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
mà Trả về một Collector mà tích tụ các yếu tố vào một bản đồ có khóa và giá trị là kết quả của việc áp dụng cung cấp chức năng lập bản đồ cho các yếu tố đầu vào.
đang làm việc
import java.io.*;
import java.util.*;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.*;
public class HelloWorld{
public static void main(String []args){
LinkedHashMap<Integer,Integer> hashMap = new LinkedHashMap<Integer,Integer>();
hashMap.put(1,5);
hashMap.put(7,9);
hashMap.put(3,8);
hashMap.put(10,5);
Function<Map.Entry<Integer,Integer>,Integer> keyMapper = x->x.getKey();
Function<Map.Entry<Integer,Integer>,Integer> valueMapper = x->x.getValue();
BinaryOperator< Integer> mergeFunction = (x,y)->x;// we do not want any merging here
Supplier<LinkedHashMap<Integer,Integer>> mapRequired =()-> {return new LinkedHashMap<Integer,Integer>();};// to maintain order we must use LinkedHashMap
Comparator<Map.Entry<Integer,Integer>> descendingComparator = (x,y)->y.getKey().compareTo(x.getKey());
// we can write it as
System.out.println(
hashMap.entrySet().stream()
.sorted (descendingComparator)
.collect(Collectors.toMap(
keyMapper,
valueMapper,
mergeFunction,
mapRequired)
)
);
// or even by writing below will also work
System.out.println(
hashMap.entrySet().stream()
.sorted ((x,y)->y.getKey().compareTo(x.getKey()))
.collect(Collectors.toMap(
x->x.getKey(),
x->x.getValue(),
(x,y)->x,
LinkedHashMap::new)
)
);
}
}
Nguồn
2015-04-26 08:38:18
Như tên gọi của nó chỉ ra ('comparingByValue'), các thông số kiểu của biểu thức lambda là 'V' không' nhập cảnh 'vì bạn cung cấp một bộ so sánh trên các giá trị, vì vậy bạn có thể thay đổi nó thành' compareByValue ((v1, v2) -> v2.compareTo (v1)) 'hoặc sử dụng tốt hơn' compareByValue (reverseOrder()) 'như @Misha được đề xuất ... –
..và khi bạn nói một cách nhanh chóng xem mã nguồn của 'toMap' bạn sẽ thấy rằng nó trả về' toMap (keyMapper, valueMapper, throwingMerger(), HashMap :: new); '. Vì vậy, về cơ bản thực hiện của bạn sẽ không làm điều gì đó rất hữu ích (mặc dù bạn đã lấy nó từ câu hỏi của OP) ... –
@AlexisC. Cảm ơn bạn đã bình luận. Tôi hoàn toàn bỏ lỡ điều đó. Đó là những gì xảy ra khi tôi viết mã mà không cố gắng biên dịch nó. – Eran