gpt4 book ai didi

java - 我应该如何使用Optional 和ifPresent(...) 重构代码以...不?

转载 作者:行者123 更新时间:2023-11-30 06:04:57 25 4
gpt4 key购买 nike

我对 Java 很陌生。我面临两个类(class),FooRequestBarRequest 。 (当然,对这个问题进行了简化。)

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 。但因为FooRequest有更多的成员,被广泛使用,并且完全涵盖了所有BarRequest的成员们,我的任务是除掉 BarRequest ,使用比较流行的FooRequest相反。

现在,一开始我以为我可能只是“升级”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 错过了一些东西?比较?有没有办法在内部使用 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
}

该方法的返回类型是有争议的,所以我将其留给您来决定。

关于java - 我应该如何使用Optional 和ifPresent(...) 重构代码以...不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com