2014-11-14 47 views
21

Tôi đang làm việc với Twitter4J. Nhưng câu hỏi tôi hỏi là tổng quát hơn. Tôi muốn truy cập id người dùng của một tweet đã cho. Hiện nay, tôi có hai tùy chọn sau:Tham chiếu phương thức chuỗi bản đồ

//Option 1 
stream.map(status -> status.getUser().getId()) 
     .forEach(System.out::println); 

//Option 2: 
stream.map(Status::getUser) 
     .map(User:getId) 
     .forEach(System.out::println); 

tôi không thích biểu thức lambda trong tùy chọn đầu tiên, và cũng không bị buộc phải gọi hai maps trong một giây. Có cách nào để tạo chuỗi tham chiếu phương pháp không? Tôi biết rằng Status::getUser::getId không hoạt động, nhưng tôi tự hỏi nếu có một thay thế.

+1

Tại sao bạn không thích 2 'cuộc gọi map'? Bạn có lo lắng về hiệu suất? Bạn không cần phải - luồng sẽ được xử lý trong một lần. –

+5

Độ chi tiết. Vì lý do tương tự 'status.getUser(). GetId()' tồn tại, tôi hy vọng rằng một cái gì đó giống như 'Status :: getUser :: getId' tồn tại. – mossaab

Trả lời

14

Không, đây là hai cách để làm điều đó. Bất cứ điều gì khác sẽ kết thúc chỉ là ít rõ ràng hơn.

Nhưng, vì bạn đã hỏi, dưới đây là một số tùy chọn.

static<T,U,R> Function<T,R> chain(
     Function<? super T, ? extends U> f1, 
     Function<? super U, ? extends R> f2) { 
    return t -> f2.apply(f1.apply(t)); 
} 

stream.map(chain(Status::getUser, User::getId)) 

Hoặc

static<T,R> Function<T,R> func(Function<T,R> f) { 
    return f; 
} 

stream.map(func(Status::getUser).andThen(User::getId)) 
+2

Trên thực tế, cả hai phương pháp làm những gì gọi 'map' hai lần thực hiện, sự khác biệt duy nhất là dòng sẽ luôn luôn sử dụng 'Function.andThen' hoặc' Function.compose' thay vì tái triển khai nó bản thân (như 'phương pháp chain' của bạn) . – Holger

+1

Tôi đang tìm kiếm thứ gì đó tránh được việc gọi lớp 'User', vì nó nên được suy ra trực tiếp từ' getUser'. Tôi chấp nhận "Không" như một câu trả lời. – mossaab

1

Trong hai phương án đề xuất, tôi có xu hướng sử dụng thứ hai, dí cuộc gọi đến map().

Có các tùy chọn khác, sử dụng API tích hợp thay vì phương thức trợ giúp, như được hiển thị here. Với phương thức Function.compose() hoặc Function.andThen(), bạn có thể chuỗi các lời gọi hàm. Predicate và các giao diện chức năng khác thực hiện các phương thức mặc định tương tự.

stream.map(((Function<Status, User>) Status::getUser).andThen(User::getId)) 
    .forEach(System.out::println); 

Ngoài ra

Function<Status, User> toUser = Status::getUser; 
stream.map(toUser.andThen(User::getId)).forEach(System.out::println); 

Nhược điểm là, để sử dụng này, các loại giao diện chức năng đã được trao một cách rõ ràng. Điều đó đòi hỏi một diễn viên hoặc một nhiệm vụ, và có vẻ hơi xấu xí. Vì vậy, đối với chuỗi ánh xạ, tôi thường sử dụng nhiều cuộc gọi map().

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