链接可选
Chaining Optionals
我有以下 class 分包商和一个名为 ResultUtils 的 Utils Class。
其中一种 Utils 方法计算分包商的最新营业年度。此方法必须 return 一个 Optional Double,因为有可能在当年新添加了一个分包商。所以它没有过去两年的统计数据。如果分包商是一年前添加的,它有最后一个营业年度的统计数据,但没有倒数第二个营业年度的统计数据。
我的问题是正确链接 getLatestResult 方法。在我的示例中,ifPresentOrElse 当然是错误的,因为它不能 return 任何值。
我应该怎么做?
public class Subcontractor
{
BusinessYear lastBusinessYear;
BusinessYear penultimateBusinessYear;
...
}
public class ResultUtils
{
public static Optional< Double > getLatestResult( Subcontractor )
{
// how to do it right here?
getResult( Subcontractor.getLastBusinessYear() )
.ifPresentOrElse( r -> return r,
() -> return getResult( Subcontractor.getPenultimateBusinessYear() ) );
}
public static Optional< Double > getResult( BusinessYear businessYear )
{
if( businessYear == null ) return Optional.empty();
// make some calculations
return Optional.of( calculcatedResult );
}
}
让我们修复代码:
public static Optional<Double> getLatestResult(Subcontractor sub) {
return getResult(sub.getLastBusinessYear()).or(() -> getResult(sub.getPenultimateBusinessYear()));
}
您有两个函数,它们都是 return 和 Optional
。你只需要第一个有值的。 Optional.or
如果 Supplier 没有值,将调用它,否则它 return 是它自己。
如果你用Java8,嗯...
public static Optional<Double> getLatestResult(Subcontractor sub) {
Optional<Double> result = getResult(sub.getLastBusinessYear());
if (result.isPresent())
return result;
return getResult(sub.getPenultimateBusinessYear());
}
获取第一个结果,检查它是否存在,如果存在,return它。
如果不是,return第二个结果。
public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
return getResult(subcontractor.getLastBusinessYear())
.or(() -> getResult(subcontractor.getPenultimateBusinessYear()));
}
假设您 运行 Java 9+。
ifPresentOrElse
展开可选的,而你仍然需要 return 一个。
- 尝试
getResult(subcontractor.getLastBusinessYear())
。
- 如果它存在,return它。
- 如果不存在,return另一个
getResult(subcontractor.getPenultimateBusinessYear())
。
一个 Java 8 的解决方案是
public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
Optional<Double> result = getResult(subcontractor.getLastBusinessYear());
return result.isPresent() ? result : getResult(subcontractor.getPenultimateBusinessYear());
}
我有以下 class 分包商和一个名为 ResultUtils 的 Utils Class。
其中一种 Utils 方法计算分包商的最新营业年度。此方法必须 return 一个 Optional Double,因为有可能在当年新添加了一个分包商。所以它没有过去两年的统计数据。如果分包商是一年前添加的,它有最后一个营业年度的统计数据,但没有倒数第二个营业年度的统计数据。
我的问题是正确链接 getLatestResult 方法。在我的示例中,ifPresentOrElse 当然是错误的,因为它不能 return 任何值。
我应该怎么做?
public class Subcontractor
{
BusinessYear lastBusinessYear;
BusinessYear penultimateBusinessYear;
...
}
public class ResultUtils
{
public static Optional< Double > getLatestResult( Subcontractor )
{
// how to do it right here?
getResult( Subcontractor.getLastBusinessYear() )
.ifPresentOrElse( r -> return r,
() -> return getResult( Subcontractor.getPenultimateBusinessYear() ) );
}
public static Optional< Double > getResult( BusinessYear businessYear )
{
if( businessYear == null ) return Optional.empty();
// make some calculations
return Optional.of( calculcatedResult );
}
}
让我们修复代码:
public static Optional<Double> getLatestResult(Subcontractor sub) {
return getResult(sub.getLastBusinessYear()).or(() -> getResult(sub.getPenultimateBusinessYear()));
}
您有两个函数,它们都是 return 和 Optional
。你只需要第一个有值的。 Optional.or
如果 Supplier 没有值,将调用它,否则它 return 是它自己。
如果你用Java8,嗯...
public static Optional<Double> getLatestResult(Subcontractor sub) {
Optional<Double> result = getResult(sub.getLastBusinessYear());
if (result.isPresent())
return result;
return getResult(sub.getPenultimateBusinessYear());
}
获取第一个结果,检查它是否存在,如果存在,return它。
如果不是,return第二个结果。
public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
return getResult(subcontractor.getLastBusinessYear())
.or(() -> getResult(subcontractor.getPenultimateBusinessYear()));
}
假设您 运行 Java 9+。
ifPresentOrElse
展开可选的,而你仍然需要 return 一个。
- 尝试
getResult(subcontractor.getLastBusinessYear())
。 - 如果它存在,return它。
- 如果不存在,return另一个
getResult(subcontractor.getPenultimateBusinessYear())
。
一个 Java 8 的解决方案是
public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
Optional<Double> result = getResult(subcontractor.getLastBusinessYear());
return result.isPresent() ? result : getResult(subcontractor.getPenultimateBusinessYear());
}