Java 我应该如何使用Optional和ifPresent(…)重构代码以。。。不

Java 我应该如何使用Optional和ifPresent(…)重构代码以。。。不,java,refactoring,optional,Java,Refactoring,Optional,我对Java非常陌生。我面临两个类,FooRequest和BarRequest。(当然,这个问题简化了。) 另一类: public class BarRequest { private Optional<DateTime> x; private Optional<DateTime> y; private Optional<BigDecimal> z; // ... getters and setters for each m

我对Java非常陌生。我面临两个类,
FooRequest
BarRequest
。(当然,这个问题简化了。)

另一类:

public class BarRequest {

    private Optional<DateTime> x;
    private Optional<DateTime> y;
    private Optional<BigDecimal> z;

    // ... getters and setters for each member
}
以下是我尝试转换的内容:

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

这是正确的吗?仅仅做一个
null
比较,我是否遗漏了什么?是否有任何方法可以在内部使用lambda表达式并避免创建
DateTime
临时?

是的,似乎您尝试将可选代码转换为典型的命令式代码在功能上是正确的。但是,调用
request.getDateBegin()
两次是次优的,即使调用并不昂贵,也可以避免

因此,我将
request.getDateBegin()
的结果缓存到一个变量中并对其进行操作

如果要多次执行此类逻辑,则可以将其放入如下方法中:

public boolean someMethodName(DateTime date, DateTime another){ 
     if(date != null && !date.equals(another)){
          // do logic
         return true; // successful
     }
     return false;  // not successful
}
该方法的返回类型是有争议的,所以我将由您决定

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
            });

我想
DateTime
是来自
joda time
谢谢。你知道我应该用
BigDecimal
做什么吗?我是否只是将其与
BigDecimal.ZERO
进行比较,而不是
null
?@andrecheong如果要在
BigDecimal
上调用实例方法,并且引用
BigDecimal
的引用可能是
null
,那么在调用之前执行null检查将是明智的对实例进行操作。但是,如果不是这种情况,那么您根本不需要空检查。如果dateBegin为空,则筛选器不提供NPE吗?@Turo nope,请参阅Optional.java
public Optional filter(谓词)的源代码
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
            });