2015-09-18 18 views
6

Tôi có một số phương thức, mỗi phương thức đều trả về một chuỗi tùy chọn. Làm thế nào để tôi kết hợp sau đó, để java gọi mỗi phương pháp, cho đến khi nó tìm thấy một kết quả?Phương thức Cascade, mỗi phương thức trả về một Java8 Tùy chọn <>

Tôi muốn kết thúc với một cái gì đó như thế này, nhưng không có orElseFlatMap() phương pháp:

import java.util.Optional; 

public class OptionalCascade { 

    public static void main(String[] args) { 
     Optional<String> result = 

       // try to get a result with method A 
       methodA() 

       // if method A did not return anything, then try method B 
       .orElseFlatMap(methodB()); 
    } 


    static Optional<String> methodA() { 
     return Optional.empty(); 
    } 

    static Optional<String> methodB() { 
     return Optional.empty(); 
    } 
} 
+0

Bạn có muốn đoản mạch ngay khi bạn nhận được kết quả không? Trong trường hợp đó, bạn không thể chỉ cần gọi phương thức trong cấu trúc. Bạn sẽ phải bọc các cuộc gọi trong lambdas (chẳng hạn như với 'orElseGet (() -> methodB()' –

+0

Tôi sẽ ở lại với tốt cũ nếu-else và nulls :) – ZhongYu

Trả lời

0

Bạn có thể làm một cái gì đó giống như một Chain-of-responsibility pattern nơi về cơ bản bạn chỉ cần gọi phương pháp đầu tiên của bạn. Sau đó, bên trong phương pháp đầu tiên của bạn nếu bạn có thể trả lại kết quả, sau đó trả lại kết quả. Nếu nó trống thì hãy gọi phương thức kế thừa của bạn.

+0

Cảm ơn câu trả lời của bạn. Tôi muốn tránh nếu/else, vv – slartidan

4

Giả sử bạn muốn sử dụng phương pháp chuẩn và có giải pháp duy nhất thể hiện, tôi có thể đưa ra chỉ với điều này:

Optional<String> result = Optional.ofNullable(methodA().orElseGet(
     () -> methodB().orElse(null))); 

Ugly. Hoặc bạn có thể viết phương pháp tĩnh của riêng mình:

public static <T> Optional<T> orElseFlatMap(Optional<T> optional, 
     Supplier<Optional<T>> other) { 
    return optional.isPresent() ? optional : other.get(); 
} 

Optional<String> result = orElseFlatMap(methodA(),() -> methodB()); 
+0

Đề xuất tốt cho cách giải quyết - nhưng vẫn không phải là "giải pháp" tôi đang tìm kiếm ... :(Cảm ơn câu trả lời của bạn – slartidan

+1

@slartidan, có lẽ bạn không cần phải lưu trữ kết quả như là một tùy chọn.Chỉ cần sử dụng 'String result = methodA(). orElseGet (() -> methodB(). orElse (whatEver));' –

+0

I giả sử OP muốn cascade nhiều hơn hai phương pháp theo cách này.Phương pháp này dẫn đến một nesting thay vì cascading cú pháp. –

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