【发布时间】:2026-02-12 15:15:01
【问题描述】:
输入:
public BigDecimal getMaxValuation(ServiceData data) {
System.out.println("getMaxValuation()");
BigDecimal calculatedAmount;
//4 String returnValue = getReturnValue(data);
Function<ServiceData,String> returnValueFn = this::getReturnValue;
BigDecimal orderSize = getOrderSize(returnValueFn.apply(data),60);
Predicate<String> gasPredicate = "GAS"::equalsIgnoreCase;
Predicate<String> oilPredicate = "OIL"::equalsIgnoreCase;
if(gasPredicate.test(returnValueFn.apply(data)))
calculatedAmount = callA(data.getValuation())
else if(oilPredicate.test(returnValueFn.apply(data)))
calculatedAmount = callB(data.getValuation())
else
calculatedAmount = callC(data.getValuation())
return calculatedAmount;
}
public String getReturnValue(ServiceData data){
System.out.println("getReturnValue()");
return returnValue;
}
在上述函数getMaxValuation()中,当我们注释第4行并将其替换为Function<ServiceData,String>时,
getReturnValue() 在执行过程中被调用了 3 次。但是当我们取消注释第 #4 行并删除所有
Function<ServiceData,String> 相关更改 getReturnValue() 仅被调用一次。
当我们使用Function 时,有什么方法可以实现相同的行为吗?
【问题讨论】:
-
不清楚你在问什么。在一种情况下,您调用该函数一次,在另一种情况下,您调用它 3 次。如果您只想使用
Function对象调用它一次,只需执行String returnValue = returnValueFn.apply(data);? -
调用function.apply 3次相当于调用getReturnValue(data) 3次。前面的评论者向您展示了如何调用该函数一次。如果我可能如此大胆,我不确定这些更改是否真的让您的新代码在比喻或字面上更具“功能性”..
-
@Atmas,谢谢。有什么建议可以将该代码更改为功能单元吗?
-
@MarkPeters,非常感谢您的建议!!
-
@busywithJava,内联解释太多了,可能超出了 SO 作为一个平台来解释这一切的范围。我鼓励您搜索一些介绍 Java 在线概念的好文章。有很多概念。如果您熟悉面向对象编程,请将其视为一个大概念。因此需要花费一些时间来检查、思考并实践它。不过,您走在正确的道路上。
标签: java java-8 functional-interface