Java中Lambda表达式的设计应用
立即解锁
发布时间: 2025-08-18 00:56:20 阅读量: 2 订阅数: 3 

### Java 中 Lambda 表达式的设计应用
#### 1. 资产价值计算与 Lambda 表达式
在资产价值计算中,我们可以使用 Lambda 表达式来灵活地选择需要计算的资产类型。通过遍历资产列表,对每个资产调用 Lambda 表达式,判断该资产的价值是否应包含在总计中。为了计算所有资产的总值,我们返回布尔值 `true`。以下是示例代码:
```java
System.out.println("Total of bonds: " +
totalAssetValues(assets, asset -> asset.getType() == AssetType.BOND));
System.out.println("Total of stocks: " +
totalAssetValues(assets, asset -> asset.getType() == AssetType.STOCK));
```
这里我们使用了 Lambda 表达式将选择逻辑与方法分离,这是策略模式的简单应用,无需创建额外的类。用户可以根据需要选择不同的选择逻辑,并将 Lambda 表达式保存到变量中进行复用。
#### 2. 委托与 Lambda 表达式
从复用的角度来看,委托比继承是更好的设计工具。我们可以将部分责任委托给 Lambda 表达式和方法引用,以减少类的数量。下面通过一个金融计算的例子来说明。
##### 2.1 创建委托类
首先,我们创建一个 `CalculateNAV` 类,用于执行金融计算:
```java
public class CalculateNAV {
public BigDecimal computeStockWorth(
final String ticker, final int shares) {
return priceFinder.apply(ticker).multiply(BigDecimal.valueOf(shares));
}
//... other methods that use the priceFinder ...
private Function<String, BigDecimal> priceFinder;
public CalculateNAV(final Function<String, BigDecimal> aPriceFinder) {
priceFinder = aPriceFinder;
}
}
```
在 `computeStockWorth` 方法中,我们从 `priceFinder` 获取股票价格,并根据股数计算净值。`priceFinder` 是一个 `Function<String, BigDecimal>` 类型的字段,通过构造函数注入,遵循依赖注入和依赖倒置原则,使代码更具扩展性。
##### 2.2 模拟 Web 服务
在进行单元测试时,为了避免依赖外部服务,我们可以使用 Lambda 表达式来模拟 Web 服务:
```java
public class CalculateNAVTest {
@Test
public void computeStockWorth() {
final CalculateNAV calculateNAV =
new CalculateNAV(ticker -> new BigDecimal("6.01"));
BigDecimal expected = new BigDecimal("6010.00");
assertEquals(0,
calculateNAV.computeStockWorth("GOOG", 1000).compareTo(expected),
0.001);
}
//...
}
```
通过传递 Lambda 表达式给 `CalculateNAV` 构造函数,我们可以轻松地模拟 Web 服务的响应,快速进行测试。
##### 2.3 集成真实 Web 服务
在实际应用中,我们可以使用方法引用将 `CalculateNAV` 类与真实的 Web 服务集成:
```java
final CalculateNAV calculateNav = new CalculateNAV(YahooFinance::getPrice);
System.out.println(String.format("100 shares of Google worth:
```
0
0
复制全文
相关推荐









