Java 我应该如何使用Optional和ifPresent(…)重构代码以。。。不
我对Java非常陌生。我面临两个类,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
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.javapublic 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
});