6

で働く Scala 開発者として、Guava へGWTの の追加を歓迎します。Optional

の最も一般的な使用例の 1 つは、Optionalメソッドからオプションの値を返す場合です ( Guava の Optional クラスのポイントへの回答で示唆されているように) 。

scala では、私はよく次のようなコードを書きます。

def someExpensiveOperation(params: Type): Option[ResultType] = ...
someExpensiveOperation(params).foreach({ val =>
  doSomethingWithVal (val)
})

Guava's Option では、次のようなものよりもエレガントなものは許可されていないようです。

Optional<MyType> optionalResponse = someExpensiveOperation(params);
if (optionalResponse.isPresent()) {
    doSomethingWithVal(optionalResponse.get())
}

ローカル変数は冗長であり、抽象化できるパターン ( if (optional.isPresent()) { doSomethingWith(optional.get()) }) を繰り返す必要があります。

もう 1 つのオプションは、Optional2 回返すメソッドを呼び出すことです。

if (someExpensiveOperation(params).isPresent()) {
    doSomethingWithVal(someExpensiveOperation(params).get())
}

しかし、コストのかかる操作を不必要に複数回呼び出すため、これは明らかに望ましくありません。

<T>useIfPresent(Optional<T> val, Closure<? super T> closure)他の人がこの非常に一般的なケースをどのように処理したか (おそらく? のような静的ユーティリティ メソッドを作成することによって)、または誰かがより洗練された解決策を見つけたかどうかに興味があります。

また、(しかし、より適切な名前が付けられていることを願っています)のようなメソッドが省略された理由を誰かが知っている場合Optional.foreach(Closure<? super T> closure)は、その理論的根拠を知りたいと思います。

4

1 に答える 1

7

Closure を書く際の無名クラスの扱いにくさは、既に記述したローカル変数や if ステートメントよりも (少なくとも Java では、必ずしも Scala ではそうではありませんが) 扱いにくく、読みにくいと感じているため、そこにはありません。

とはいえ、別の選択肢は

for (Foo x : someExpensiveOperation().asSet()) {
  // do stuff with x
}

ここで必要なことに注意してasSetください -Optional非常に意図的にそれ自体を実装していませんIterable

于 2012-12-08T02:05:36.017 に答える