2017-12-21 106 views
5

Giả sử chúng ta có một lớp Customer:Thay lambda với tài liệu tham khảo phương pháp trong flatMap trong mảng bản đồ

public class Customer { 
    private Car[] cars; 
    // getter, setter, constructor 
} 

và bộ sưu tập của khách hàng mà chúng tôi cần để lập bản đồ trên xe ô tô.

Hiện nay tôi đang làm việc đó bằng cách nào đó như thế này:

Collection<Customer> customers = ... 
customers.stream().flatMap(
     customer -> Arrays.stream(customer.getCars()) 
)... 

Nó hoạt động tốt, nhưng mã không giống tao nhã. Tôi thực sự muốn thay thế nó bằng mã sử dụng các tham chiếu phương thức thường trông dễ đọc hơn và gọn hơn. Nhưng sử dụng một trường kiểu mảng làm cho nó khó.

Câu hỏi: có cách nào để tăng cường cuộc gọi flatMap để có thể đọc/nhỏ gọn/rõ ràng hơn không?

+6

Bạn cũng có thể làm 'khách hàng.stream() bản đồ (Khách hàng :: getCars) .flatMap (Mảng :: stream)' nhưng IMO giải pháp của bạn có thể đọc được và thanh lịch. –

Trả lời

7

Bạn có thể chia flatMap gọi vào hai cuộc gọi - mapflatMap - từng nhận được một tài liệu tham khảo phương pháp:

Collection<Customer> customers = ... 
customers.stream() 
     .map(Customer::getCars) 
     .flatMap(Arrays::stream)... 
3

Bạn có thể sử dụng:

.map(Customer::getCars) 
.flatMap(Arrays::stream) 

Nhưng tôi không nghĩ rằng đây là thêm elegant bằng bất kỳ cách nào. Và cũng có tất cả mọi thứ như các phương pháp tham khảo như thế này làm cho nó ít có thể đọc được, ít nhất là đối với tôi. Tôi nên giải thích bản thân mình là lý do tại sao tôi thấy điều này ít có thể đọc được, bởi vì có hai giai đoạn mà tôi cần phải hiểu bây giờ khi đọc mã này. lý do tại sao map được thực hiện và lý do tại sao flatMap được thực hiện - có vẻ hơi nhỏ.

6

Chỉ cần thêm phương thức để Customer trả lại luồng Car s. Sử dụng quy ước đặt tên điển hình, nó sẽ trông như

public Stream<Car> cars() { 
    return Arrays.stream(cars); 
} 

Sau đó, bạn có thể sử dụng nó như

customers.stream().flatMap(Customer::cars) 

Nói chung, tính chất của một loại có thể thay đổi như một mảng phải được xử lý cẩn thận. Cách duy nhất để ngăn chặn sửa đổi thông qua một getter, là tạo một bản sao. Vì vậy, việc cung cấp phương thức thay thế trả về loại chỉ đọc như Stream, không cần sao chép, có sử dụng bổ sung ngoài việc làm cho gọn gàng flatMap.

+5

Cách tiếp cận này có lợi thế thêm rằng, nếu mảng ô tô là 'null', bạn cũng có thể xử lý trường hợp này trong phương thức:' return cars == null? Stream.empty(): Arrays.stream (ô tô); ' –

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