【发布时间】:2019-07-05 17:19:10
【问题描述】:
我有这个方法,它调用多个 API 并聚合所有结果并在 Map 中返回它们,其中每组结果都与目标 API 匹配,以便它们可以在服务中正确分组和显示。
public AggregateResults search(QueryParams params) {
Stream<APITarget> targets = params.getTargets().parallelStream();
Function<APITarget, APIResults> func = (APITarget target) -> {
if (params.length() >= MIN_LENGTH) {
switch (target) {
case api1:
return searchAPI1(params);
case api2:
return searchAPI2(params);
.
.
case apin:
return searchAPIn(params);
}
}
return new APIResults.Builder().build();
};
Map<APITarget, APIResults> results = targets.collect(Collectors.toMap(t -> t, func));
return AggregateResults;
}
我现在必须重构这段代码,例如 API 1 - 3 可以在一个函数中调用,然后 API 4 - N 可以从另一个函数中调用。这些函数将从不同的方法调用,因此我需要将此函数移出此方法,然后将 QueryParams 对象作为另一个参数传递给该函数,但随后我遇到了函数无法接受的问题一个参数。 例如
Function<APITarget, APIResults> exampleFunc = (APITarget target, QueryParams params) -> {
if (params.length() >= MIN_LENGTH) {
switch (target) {
case api1:
return searchAPI1(params);
case api2:
return searchAPI2(params);
}
}
return new APIResults.Builder().build();
};
我在这里看到过类似的东西:Can a java lambda have more than 1 parameter? 但是 BiFunctions 的示例仅显示它们被用作 lambdas,因此在被外部方法调用时不起作用,据我所知。 此外,当它谈到创建新的 FunctionalInterface 时,我不确定要在我所需的函数中使用新接口究竟需要什么。
任何想法都会很棒。
【问题讨论】:
-
BiFunction<APITarget, QueryParams, APIResults>有什么问题? “...仅显示它们被用作 lambdas,因此在被外部方法调用时将不起作用” - 我不明白你问题的那一部分。 -
这个例子是一个 lambda
BiFunction<String, String, String> function1 = (s1, s2) -> { String s3 = s1 + s2; return s3; };我需要能够在类中定义函数,然后从两个不同的方法中调用它,比如Map<APITarget, APIResults> results = targets.collect(Collectors.toMap(t -> t, func(t,params)));
标签: java function lambda java-stream