使用Optional wrapper对多个条件执行OR

时间:2018-04-27 21:35:16

标签: java java-8 optional

我正在尝试理解并使用Java 8 - 可选功能。我想重构这个代码块。没有可选我有这样的条件。

ClassA objA = findObject();
if(objA == null || objA.isDeleted()){
  throw Exception("Object is not found.");
}

我想使用Optional wrapper转换此块。我已经阅读过有关过滤器,ifPresent函数,但我找不到方法。也许这很简单,但我是Java 8的新手。如果你能提供帮助,我将不胜感激。

3 个答案:

答案 0 :(得分:6)

您不应该使用Optional<T>来单独替换if声明,因为它不会更好,并且不会为您带来任何好处。一个更好的解决方案是让findObject()方法返回Optional<ClassA>

这使得此方法的调用者决定在&#34; no value&#34;情况下。

假设您已进行此更改,则可以使用Optional<T>类型:

findObject().filter(a -> !a.isDeleted())  // if not deleted then do something 
            .map(...)  // do some mapping maybe?
            ...  // do some additional logic
            .orElseThrow(() -> new Exception("Object is not found."));//if object not found then throw exception

请参阅Optional<T>课程,让自己熟悉API和可用的方法。

答案 1 :(得分:3)

@Eric正如您在评论中提到的,如果您不希望(不能)更改某些约束的findObject()的返回类型,您可以执行以下操作:

ClassA objA = findObject();
Optional<ClassA> myOpt = 
             Optional.ofNullable(objA)
                     .filter(e->!e.isDeleted())
                     .orElseThrow(()->new Exception("Object is not found.");

答案 2 :(得分:0)

using UnityEngine;
using UnityEngine.EventSystems;

public class Drop : EventTrigger {
    public override void OnDrop(PointerEventData eventData) {
        // Check if the eventData is Null.
        if (eventData.pointerDrag != null) {
            Debug.Log("OnDrop called.");
        }
    }
}