构造函数当做Function用做方法入参
1.先有一个类,有一个构造函数
public abstract class AbstractMonitorAction<T> implements Action<T>{
}
public class StopMonitorAction extends AbstractMonitorAction<CheckResult> {
private final List<ScanResult> scanResults;
private List<CheckResult> checkResults;
public StopMonitorAction(List<ScanResult> scanResults) {
this.scanResults = scanResults;
}
@Override
public void execute() {
checkResults = Lists.newArrayList();
List<List<ScanResult>> partitions = Lists.partition(scanResults, 500);
for (List<ScanResult> partition : partitions) {
processPartition(partition);
}
}
}
2.定义一个Function用来指定不同的构造函数
Function<List<ScanResult>,Action<CheckResult>>
入参:List
出参:Action
3.分析上述构造函数
- 发现构造函数的入参就是List
- 构造函数一般返回类自己对象,因为类有继承关系,父类有实现接口逻辑,用多态特性可以用接口接受返回类型
- 所有构造函数是可以用做Function类型的接收的
4.实际定义例子
private void processScanResults(List<ScanResult> scanResults, String actionName, List<CheckResult> checkResults, Function<List<ScanResult>, Action<CheckResult>> actionConstructor) {
List<ScanResult> filteredResults = scanResults.stream()
.filter(scanResult -> scanResult.getScanValue().equalsIgnoreCase(actionName))
.collect(Collectors.toList());
if (!filteredResults.isEmpty()) {
Action<CheckResult> action = actionConstructor.apply(filteredResults);
action.execute();
checkResults.addAll(action.getResult());
}
}
# 使用,其中StopMonitorAction::new 会自动识别为是Function<List<ScanResult>, Action<CheckResult>> 类型
processScanResults(scanResults, TaiShanMonitorScanExector.MonitorAction.STOP_MONITOR.name(), checkResults, StopMonitorAction::new);
5.方法引用的参数
- 无参数构造函数
如果目标类型是一个没有参数的构造函数,可以使用 Supplier 接口:
Supplier<StopMonitorAction> supplier = StopMonitorAction::new;
StopMonitorAction action = supplier.get();
- 带一个参数的构造函数
如果目标类型是一个带一个参数的构造函数,可以使用 Function 接口:
Function<String, StopMonitorAction> function = StopMonitorAction::new;
StopMonitorAction action = function.apply("exampleName");
- 带两个参数的构造函数
如果目标类型是一个带两个参数的构造函数,可以使用 BiFunction 接口:
BiFunction<String, Integer, StopMonitorAction> biFunction = StopMonitorAction::new;
StopMonitorAction action = biFunction.apply("exampleName", 123);
原创:做时间的朋友