2014-12-31 32 views
5

Mã sau đây chuyển đổi danh sách đối tượng thành danh sách các đối tượng tùy chọn. Có cách nào thanh lịch để thực hiện điều này bằng cách sử dụng luồng của Java 8 không?Chuyển đổi danh sách các đối tượng thành danh sách các đối tượng tùy chọn trong Java

List<Object> originalList = Arrays.asList(new Object(), new Object()); 
List<Optional<Object>> convertedList = new ArrayList<>(); 
for (Object object : originalList) { 
    convertedList.add(Optional.of(object)); 
} 

Tôi đã thử đoạn mã sau đây.

List<Optional<Object>> convertedList = originalList.stream().map((o) -> Optional.of(o)); 

Tuy nhiên điều này mang lại những lỗi biên dịch sau:

of(T) in Optional cannot be applied to (java.lang.Object) 

này được sử dụng lớp java.util.Optional chứ không phải là một ổi.

Trả lời

8

Bạn quên thu thập các phần tử của Stream trong danh sách. Nó nên là:

List<Optional<Object>> convertedList = originalList.stream() 
                .map((o) -> Optional.of(o)) 
                .collect(Collectors.toList()); 
               //or .collect(Collectors.toCollection(LinkedList::new)); if you want a specific List implementation 

Lưu ý rằng bạn có thể tránh việc tạo ra một lamdba và sử dụng một tài liệu tham khảo phương pháp trong trường hợp này với .map(Optional::of).

Tôi không hiểu tại sao bạn sẽ nhận được List của Optional nếu bạn biết trước rằng các yếu tố trong danh sách không phải là không. Có lẽ nó chỉ là để có được trong thực tế với Java 8, nhưng như @Eran nói bạn nên sử dụng Optional::ofNullable thay thế.

+0

Cảm ơn bạn đã trả lời. Tôi cắt mã cho các mục đích của ví dụ. Danh sách chuyển đổi sẽ có các giá trị vắng mặt được thêm vào nó sau này trong trường hợp sử dụng của tôi và bản gốcList không chứa các giá trị rỗng. – kentsurrey

+2

Trong khi tôi muốn giới thiệu các hình thức ref phương thức trên các hình thức lambda, không ngốc mình rằng bạn đang "tránh tạo ra một lambda" bằng cách sử dụng hình thức tham khảo phương pháp. Phương thức refs được chuyển đổi sang các giao diện chức năng thông qua cùng một máy móc như lambdas. Tuy nhiên, những quyết định này nên được thực hiện trên cơ sở khả năng đọc/bảo trì mã 99.999% thời gian, vì vậy bạn chỉ nên đi với những gì dễ đọc hơn - mà thường là phương pháp ref. –

4

Dường như bạn quên để thu thập Stream vào một danh sách:

List<Optional<Object>> convertedList = 
    originalList.stream() 
       .map((o) -> Optional.ofNullable(o)) 
       .collect(Collectors.toList()); 

Bạn nên sử dụng ofNullable tuy nhiên, kể từ khi of đòi hỏi một đối tượng null không (nó sẽ ném một NullPointerException khi thông qua một tham chiếu null).

+0

Cảm ơn câu trả lời. Đó là một điểm tốt về phương thức ofNullable, tuy nhiên trong trường hợp này tôi biết danh sách của tôi không chứa null - chỉ sau đoạn mã này mà tôi sẽ thêm các giá trị vắng mặt vào danh sách mới. – kentsurrey

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