それがnullである場合は、新しいリストを作成する方法「オプション」の「orElseGet」を使用する方法はありますか?

ロビン日:

私たちは以下のような構造でクラスを持っていると言います。

class Resource{
   String id; 
   String name;
   List<String> friends;
}

このように、「オプション」を使用してリストを取得する方法はあります:

Optional.of(resource.getFriends()).map(friends -> {
    friends.add("John");
    return friends;
}).orElseGet(
    //do something here.
)

前誰がなかった場合は、新しいリストが期待されています。

オレVV:

それはあなたのより正確な機能要件に依存します。私はオプションのカップルを提示します。

あなただけのリソースとジョンの友人を含むリストが必要な場合:

    List<String> listWithJohn = Optional.ofNullable(resource.getFriends())
            .orElseGet(ArrayList::new);
    listWithJohn.add("John");

バジルボークコメントで述べたように、Javaの9以来、リストの初期化は、代わりに使用して行うことができますObjects.requireNonNullElseGet

    List<String> listWithJohn
            = Objects.requireNonNullElseGet(resource.getFriends(), ArrayList::new);

あなたはジョンがリソースの友人に追加する代わりにした場合、私はことを示唆しているgetFriends方法はどこ編集することです:

/** @return The list of friends, not null */
public List<String> getFriends() {
    if (friends == null) {
        friends = new ArrayList<>();
    }
    return friends;
}

リスト自体を返すことしかし、それ以降の時間に不必要かつ予測できない彼らの友人リストを修正する発信者へのリソースが脆弱になります。(友人としてジョンを追加することから、呼び出し元を防止する)代わりに、リストのコピーまたはそれの変更不可能なビューを返すために、多くの場合、1希望。この場合、リソースは持っている可能性がありaddFriend、友人を追加するための方法を。

EDIT:

唯一のラムダコード行で作成する方法はありますか?

    friends = friends == null ? new ArrayList<>() : friends;
    return friends;

しかし、私はそれが読みにくく見つけるだろう(とそこにはラムダはありません、それだけでワンライナーです)。それとも、それは完全に不可解したい場合:

    return friends = friends == null ? new ArrayList<>() : friends;

お勧めできません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=214512&siteId=1