私はJavaにとって非常に新しいです。私は2つのクラス、FooRequest
とBarRequest
に直面しています。 (もちろん、この質問のために簡素化された)OptionalとifPresent(...)を使用してコードをどのようにリファクタリングする必要がありますか?
public class FooRequest {
private String a;
private String b;
private String c;
private DateTime x;
private DateTime y;
private BigDecimal z;
// ... and more members
// ... getters and setters for each member
}
そして、他のクラス:
public class BarRequest {
private Optional<DateTime> x;
private Optional<DateTime> y;
private Optional<BigDecimal> z;
// ... getters and setters for each member
}
これらは別の人によって書かれた、一方が他方のOptional
を好む、使用時にはnullチェックを好みます。しかしFooRequest
にはもっと多くのメンバーがいて、広く使用されており、BarRequest
のメンバー全員をカバーしているので、代わりにFooRequest
を使用してBarRequest
を取り除くことを任されます。
私は最初に、FooRequest
のメンバー(少なくともBarRequest
で使用されている3人)をOptional<>
に「アップグレードする」と考えました。しかし、これは多数のコンパイルの問題を引き起こしました(基本的には、FooRequest
が返されたか使用されていました)。私はOptional<T>
をドロップインできないことを学んだT
を置き換えます。
私のチームリードは、Optional<>
を維持することが現実的ではないことを確認しました。変更を最小限に抑えるため、以前はOptional<>
を使ってコードを書き直したいと思っています。例えば、
request.getDateBegin().ifPresent((dateBegin) -> {
if (!dateBegin.equals(ad.startDate())) {
// ...
}
}
は、ここでは、この変換での私の試みです:
if (request.getDateBegin() != null) {
DateTime dateBegin = request.getDateBegin();
if (!dateBegin.equals(ad.startDate())) {
// ...
}
}
は、この正しいですか?私は単にnull
の比較を行うだけで何かが欠けていますか?ラムダ式を内部で使用し、一時的にDateTime
を作成する方法はありますか?
dateBeginがnullの場合、フィルタはNPEを返しませんか? – Turo
@Turo nopeは、オプションのソースコードを参照してください。java 'publicオプションフィルタ(述語 super T>述語){ Objects.requireNonNull(述語); (!isPresent()) これを返す; else return predicate.test(value)?これは:空(); } ' –
ありがとう、レッスンが学んだ。 – Turo