web-dev-qa-db-ja.com

Guavaを使用して、可能なnull値をデフォルト値に変換する方法は?

渡されたオブジェクト参照がnullの場合、Guavaはデフォルト値を取得するメソッドを提供しますか?私は<T> T nullToDefault(T obj, T default)のようなものを探していますdefaultobjnullです。

ここでstackoverflowで私はそれについて何も見つけませんでした。私は純粋なグアバソリューションを探しています(もしあれば)!

Gauva 10 APIには何も見つかりませんでしたが、com.google.common.base.Objectsは有望に見えますが、似たようなものが欠けています。

53
Chriss

_Objects.firstNonNull_に加えて、Guava 10.0では、このタイプの問題に対するより一般的な解決策として Optional クラスを追加しました。

Optionalは、値を含む場合と含まない場合があります。 Optionalインスタンスを作成するにはさまざまな方法がありますが、あなたの場合、ファクトリメソッドOptional.fromNullable(T)が適切です。

Optionalを取得したら、orメソッドのいずれかを使用して、Optionalに含まれる値(値を含む場合)または他の値(取得する場合)ではない)。

すべてをまとめると、簡単な例は次のようになります。

_T value = Optional.fromNullable(obj).or(defaultValue);
_

Optionalの柔軟性は、デフォルト値にSupplierを使用する場合(したがって、必要な場合を除いてそれを取得するための計算を行わない場合)、または複数のチェーンを使用する場合存在する最初の値を取得するためのオプション値を一緒に、例えば:

_T value = someOptional.or(someOtherOptional).or(someDefault);
_
72
ColinD

どう?

MoreObjects.firstNonNull(obj, default)

JavaDoc を参照してください。

(歴史上の注意:MoreObjectsクラスはObjectsと呼ばれていましたが、 Java.util.Objects Java 7.で導入されたクラス。現在、Guava Objectsクラスは廃止されました。)

57
Simon Nickerson

前述したように、グアバのソリューションは正しいです。

ただし、純粋なJDKソリューションとJava 8があります。

Optional.ofNullable( var ).orElse( defaultValue );

Java.util.Optionalのドキュメントを参照してください

39
Nicolas Nobelis

これでうまくいくはずです:Objects.firstNonNull(o, default)
を参照してください guava API doc

9
Jens Hoffmann

オブジェクトがまだOptionalでない場合、Optional/firstNotNullの提案は、単純なJava機能、三項演算子:

T myVal = (val != null) ? val : defaultVal;

依存関係と複数のメソッド呼び出しを含めると、三項演算子と同じくらい読み取りが複雑になります。 「私のメソッドがオブジェクトを返す場合と返さない場合」のセマンティクスに反してOptionalを使用することは、何か間違ったことをしているという赤い旗であると主張することさえありますそのことの意味的意味)。

三項演算子の詳細については、 http://alvinalexander.com/Java/edu/pj/pj010018 を参照してください。

8
MonkeyWithDarts

文字列についてのみ話している場合は、Apache CommonsのdefaultStringおよびdefaultIfEmptyメソッドもあります。

defaultStringはtrue nullのデフォルトのみを提供しますが、defaultIfEmptyはnullまたは空の文字列のデフォルトを提供します。

DefaultIfBlankもあり、空白文字列であってもデフォルトを提供します。

例えば.

String description = "";
description = StringUtils.defaultIfBlank(description, "Theodore"); 

説明は「セオドア」に等しくなります

編集:Apache Commonsには、完全にベイク処理されたオブジェクトに対してnullのデフォルトを行うObjectUtilsクラスもあります...

7
Daniel Schmidt

参考までに、Java 9には、希望どおりに行う2つのメソッドがあります。

public static <T> T requireNonNullElse(T obj, T defaultObj);

そして、怠zyなバージョン:

public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
6
ZhekaKozlov

Java.util.ObjectsとGuavaのオプションは、nullをデフォルト値にオーバーライドするための素晴らしい方法を提供します...それらを頻繁に使用しています

しかし、ここにもっと命令的な心のためのものがあります:

public static <T> T firstNotNuLL(T...args){
    for (T arg : args)
        if ( arg != null) return arg;
    throw new NullPointerException();  
}
3
kunwar.sangram

Guava 10に組み込まれているOptionalの使用を検討してください。Optional.fromNullable(var).orNull()Optional.fromNullable(var).or(Optional.of(var2)).orNull()など、複数のオプションをつなぎ合わせることができます。

1
Ray

ObjectUtils.defaultIfNull() from org.Apache.commons.lang library:を使用できます。

public static <T> T defaultIfNull(T object, T defaultValue)
0
Lu55