web-dev-qa-db-ja.com

Java 8オプション:ifPresentがオブジェクトを返すか、ElseThrow例外

私はこのようなものを作ろうとしています:

 private String getStringIfObjectIsPresent(Optional<Object> object){
        object.ifPresent(() ->{
            String result = "result";
            //some logic with result and return it
            return result;
        }).orElseThrow(MyCustomException::new);
    }

IfPresentはコンシューマー機能インターフェイスをvoid accept(T t)を持つパラメーターとして使用するため、これは機能しません。値を返すことはできません。他の方法はありますか?

23
RichardK

実際に検索しているのは: Optional.map です。コードは次のようになります。

object.map(o -> "result" /* or your function */)
      .orElseThrow(MyCustomException::new);

可能であれば、Optionalを渡すことを避けたいと思います。最終的に、ここでOptionalを使用しても何も得られません。少し他のバリアント:

public String getString(Object yourObject) {
  if (Objects.isNull(yourObject)) { // or use requireNonNull instead if NullPointerException suffices
     throw new MyCustomException();
  }
  String result = ...
  // your string mapping function
  return result;
}

別の呼び出しのためにOptional-オブジェクトを既に持っている場合、単一の理由で、mapなどの代わりにisPresent- methodを使用することをお勧めします。より読みやすくなります(明らかに主観的な決定です;-))。

31
Roland

値が利用可能であることを確認した後、マッピングを好む

private String getStringIfObjectIsPresent(Optional<Object> object) {
   Object ob = object.orElseThrow(MyCustomException::new);
    // do your mapping with ob
   String result = your-map-function(ob);
  return result;
}

または1つのライナー

private String getStringIfObjectIsPresent(Optional<Object> object) {
   return your-map-function(object.orElseThrow(MyCustomException::new));
}
12
iamiddy

代わりにmap-関数を使用してください。オプション内の値を変換します。

このような:

private String getStringIfObjectIsPresent(Optional<Object> object) {
    return object.map(() -> {
        String result = "result";
        //some logic with result and return it
        return result;
    }).orElseThrow(MyCustomException::new);
}
8
marstran

ここに2つのオプション:

ifPresentmapに置き換え、Functionの代わりにConsumerを使用します

private String getStringIfObjectIsPresent(Optional<Object> object) {
    return object
            .map(obj -> {
                String result = "result";
                //some logic with result and return it
                return result;
            })
            .orElseThrow(MyCustomException::new);
}

isPresentを使用します。

private String getStringIfObjectIsPresent(Optional<Object> object) {
    if (object.isPresent()) {
        String result = "result";
        //some logic with result and return it
        return result;
    } else {
        throw new MyCustomException();
    }
}
6
Vlad Bochenin