2016-10-07 14 views
10

Có cách nào thanh lịch hơn để đạt được điều này trong Java 8 không?Java 8 collect() only isPresent() Giá trị tùy chọn

list.stream() 
    .map(e -> myclass.returnsOptional(e)) 
    .filter(Optional::isPresent) 
    .map(Optional::get) 
    .collect(Collectors.toList()); 

Tôi đang nói về filter(Optional::isPresent) tiếp theo map(Optional::get), tôi muốn thanh lịch thu thập trong một danh sách chỉ Optional kết quả có giá trị.

+7

Có vẻ tốt với tôi. Tôi không chắc những gì bạn không thích về nó. – khelwood

+0

Nếu tất cả các Optionals của bạn có kết quả thì đây không phải là tùy chọn nữa ... thay vì trả về tùy chọn và kiểm tra nếu isPresent bạn có thể trả về giá trị rỗng và bộ lọc, nó sẽ ngắn hơn một bước. 'list.stream(). map (e -> myclass.returnsObjectOrNull (e)). Bộ lọc (đối tượng :: nonNull) .collect (Collectors.toList())' – alfasin

+2

.map (o -> o.map (Luồng: : of) .orElseGet (Stream :: empty)) hoặc xem câu trả lời ở đây: http://stackoverflow.com/questions/22725537/using-java-8s-optional-with-streamflatmap – hasan

Trả lời

-1

Không chắc liệu nó có khác biệt hay không nhưng bạn chỉ có thể lọc dựa trên tùy chọn của mình thay vì nhận tùy chọn và lọc tiếp theo. Một cái gì đó như thế này?

list.stream() 
    .filter(e -> myclass.returnsOptional(e).isPresent()) 
    .collect(Collectors.toList()); 

Note: Điều này sẽ chỉ làm việc nếu returnsOptional trả về kiểu đối tượng tương tự như các loại mục danh sách ban đầu của bạn.

+0

Điều đó sẽ không tạo ra cùng danh sách giống như danh sách OP được tạo ra. – khelwood

+0

hmm tại sao không? –

+0

Bởi vì 'danh sách' có kiểu' Foo' và 'myclass.returnsOptional (Foo)' trả về 'Tùy chọn '. Cuối cùng tôi cần 'Danh sách ' và bạn đang sản xuất 'Danh sách ' –

1

Trong trường hợp của bạn, bạn có thể sử dụng một flatMap thay vì kết hợp của mapfilter và một lần nữa map. Để làm điều đó, tốt hơn là xác định một hàm riêng biệt để tạo Luồng: public private static Stream<Integer> createStream(String e) để không có nhiều dòng mã trong biểu thức lambda.

Xin vui lòng xem đầy đủ Demo ví dụ của tôi:

public class Demo{ 
    public static void main(String[] args) { 
     List<String> list = Arrays.asList("1", "2", "Hi Stack!", "not", "5"); 
     List<Integer> newList = list.stream() 
       .flatMap(Demo::createStream) 
       .collect(Collectors.toList()); 
     System.out.println(newList); 
    } 

    public static Stream<Integer> createStream(String e) { 
     Optional<Integer> opt = MyClass.returnsOptional(e); 
     return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty(); 
    } 
} 


class MyClass { 
    public static Optional<Integer> returnsOptional(String e) { 
     try { 
      return Optional.of(Integer.valueOf(e)); 
     } catch (NumberFormatException ex) { 
      return Optional.empty(); 
     } 
    } 
} 

trong trường hợp returnsOptional không thể tĩnh, bạn sẽ cần phải sử dụng "mũi tên" biểu hiện thay vì "phương pháp tham khảo"

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