2017-10-16 27 views
8

Hãy xem mã bên dưới.Làm thế nào một biểu thức lambda ánh xạ vào một giao diện chức năng?

List<String> names = Arrays.asList("Adam", "Brian", "Supun"); 
    List<Integer> lengths = names.stream() 
           .map(name -> name.length()) 
           .collect(Collectors.toList()); 

Và đơn giản sau đó sẽ xem javadoc cho streams.map. Có chữ ký cho phương thức map xuất hiện như thế này.

<R> Stream<R> map(Function<? super T,? extends R> mapper) 

ai đó có thể vui lòng giải thích cách JVM bản đồ biểu thức lambda chúng tôi đã cung cấp (name -> name.length()) về Function<? super T,? extends R> mapper?

+2

Bạn đang cố gắng hoàn thành điều gì? Bạn không bao giờ cần tạo các biến cục bộ của loại Luồng. Bạn đang tìm kiếm 'names.stream(). Map (...). Thu thập (Collectors.toList())'? Ngoài ra, không sử dụng loại Danh sách thô. – Michael

+0

@Michael thực sự tôi cần người xem tập trung vào phần biểu hiện lambda. Vì vậy, tôi đã không thêm các bổ sung thứ hai mà bạn đã đề cập. Điều này chỉ là để hiểu được bản đồ lambda thành một giao diện chức năng. Không có gì khác. :)) –

+1

@Michael có quan điểm của bạn. Cảm ơn bạn. :)) Hy vọng tôi đã sửa mã. –

Trả lời

8

A Function là thứ mất X và trả lại Y.

? super T  == String 
? extends R == Integer 

cơ bản với name -> name.length() bạn đang thực hiện @FunctionlInterface Function<T,R> với trọng phương pháp trừu tượng đơn R apply(T t).

Bạn cũng có thể rút ngắn rằng với một tài liệu tham khảo phương pháp:

Stream<Integer> lengths = names.stream().map(String::length); 
2

Kiểm tra apply phương pháp từ Function:

R apply(T t); 

? extends R là kiểu trả về, ? super T được lấy loại

Như Function lớp chỉ có một phương thức không mặc định là public, c bản đồ lambda của bạn thành Function dụ

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