2017-12-26 24 views
2

私はJavaにとって非常に新しいです。私は2つのクラス、FooRequestBarRequestに直面しています。 (もちろん、この質問のために簡素化された)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を作成する方法はありますか?

答えて

2
if (request.getDateBegin() != null) { 
    DateTime dateBegin = request.getDateBegin(); 
    if (!dateBegin.equals(ad.startDate())) { 
    // ... 
    } 
} 

Optional.ofNullable(request.getDateBegin()) 
      .filter(date -> !date.equals(ad.startDate())) 
      .ifPresent(date -> { 
       // ... whatever 
      }); 
+0

dateBeginがnullの場合、フィルタはNPEを返しませんか? – Turo

+1

@Turo nopeは、オプションのソースコードを参照してください。java 'publicオプションフィルタ(述語述語){ Objects.requireNonNull(述語); (!isPresent()) これを返す; else return predicate.test(value)?これは:空(); } ' –

+0

ありがとう、レッスンが学んだ。 – Turo

2

はい、オプションのコードを標準的な命令コードに変換しようとすると、機能面で正しいと思われるようです。ただし、コールが高価ではない場合でも、request.getDateBegin()を2回呼び出すことは最適ではありません。回避することができます。

したがって、私はrequest.getDateBegin()の結果を変数にキャッシュし、それを操作します。

あなたがこのタイプのロジックを何度もやろうとしているなら、あなたのような方法にそれを置くことができますが:

public boolean someMethodName(DateTime date, DateTime another){ 
    if(date != null && !date.equals(another)){ 
      // do logic 
     return true; // successful 
    } 
    return false; // not successful 
} 

メソッドの戻り値の型は、議論の余地あるので、私はそれを残しておきますあなたが決定する。

+0

に置き換えることができ、私は 'DateTime'が、私が見るジョダ-time' – sfat

+0

@sfat'から明確にするためのおかげだと思います;) –

+0

感謝。 BigDecimalで何をすべきか知っていますか? 'null'ではなく' BigDecimal.ZERO'と比較するだけですか? –

関連する問題