2016-04-01 26 views
15

Tôi muốn bắt đầu một Map<String, BigDecimal> và muốn luôn đặt cùng một giá trị BigDecimal từ bên ngoài luồng.Cách tạo bản đồ với API luồng Java bằng cách sử dụng giá trị bên ngoài luồng?

BigDecimal samePrice; 
Set<String> set; 

set.stream().collect(Collectors.toMap(Function.identity(), samePrice)); 

Tuy nhiên Java phàn nàn như sau:

Phương pháp toMap (Function, Function) trong thu gom loại không áp dụng cho các đối số (Function, BigDecimal)

Tại sao sao tôi không thể sử dụng BigDecimal từ bên ngoài? Nếu tôi viết:

et.stream().collect(Collectors.toMap(Function.identity(), new BigDecimal())); 

nó sẽ hoạt động, nhưng đó không phải là điều tôi muốn.

Trả lời

15

Đối số thứ hai (như đối số thứ nhất) là toMap(keyMapper, valueMapper) là hàm lấy phần tử luồng và trả về giá trị của bản đồ.

Trong trường hợp này, bạn muốn bỏ qua nó để bạn có thể có:

set.stream().collect(Collectors.toMap(Function.identity(), e -> samePrice)); 

Lưu ý rằng nỗ lực thứ hai của bạn sẽ không hoạt động vì lý do tương tự.

9

Collectors#toMap hy vọng hai Functions

set.stream().collect(Collectors.toMap(Function.identity(), x -> samePrice)); 

Bạn có thể tìm thấy gần như ví dụ tương tự trong JavaDoc

Map<Student, Double> studentToGPA 
    students.stream().collect(toMap(Functions.identity(), 
            student -> computeGPA(student))); 
6

Như đã nói trong câu trả lời khác, bạn cần phải xác định một hàm ánh xạ từng phần tử với giá trị cố định như element -> samePrice.

Như một sự bổ sung, nếu bạn muốn cụ thể điền vào một ConcurrentHashMap, có một tính năng gọn gàng mà không cần một thao tác dòng ở tất cả:

ConcurrentHashMap<String,BigDecimal> map = new ConcurrentHashMap<>(); 
map.keySet(samePrice).addAll(set); 

Thật không may, không có hoạt động như vậy cho tùy ý Map S.

Các vấn đề liên quan