Unwrap an Optional only if it is present

后端 未结 2 1729
执念已碎
执念已碎 2021-02-14 01:27

So currently I have

String uri = website.getUri();
Optional pageDetail = webClient.getDetailOfUri(uri);
String displayName;
String description;         


        
2条回答
  •  南旧
    南旧 (楼主)
    2021-02-14 02:07

    Use Optional#orElseGet that takes a Supplier:

    // Reference to the constructor, but you could use a Factory, etc.
    // All you need is a method that returns a PageDetail
    // See the Javadoc and http://www.byteslounge.com/tutorials/java-8-consumer-and-supplier
    Supplier emptySupplier = PageDetail::new;
    
    pageDetail = pageDetail.orElseGet(emptySupplier);
    // works the same
    //pageDetail = pageDetail.orElseGet(() -> new PageDetail());
    
    String displayname = pageDetail.getName();
    String uri = pageDetail.getUri();
    

    orElseGet will create an empty PageDetail only if the Optional has a null value. This keeps your code resource efficient.

    Editable/compilable sample : https://ideone.com/9h1Ntg

    Edit: Thanks everybody for the feedback! I was actually adding orElseGet which I find better. I also fixed the code to unwrap the Optional so pageDetail ends being an actual PageDetail instance.

    Edit 2: Added different syntax example and editable/compilable example.

提交回复
热议问题