具有可从方法调用的三个参数的 Java 函数

我有这种调用多个 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();

};

我在这里看到过类似的东西:Java lambda 可以有多个参数吗? 但是 BiFunctions 的示例仅显示它们被用作 lambda,因此在被外部方法调用时不会起作用,据我所知。此外,当它谈到创建一个新的 FunctionalInterface 时,我不确定究竟需要什么才能在我需要的功能中使用新接口。


任何想法都会很棒。


HUH函数
浏览 141回答 2
2回答

米脂

修改以反映示例首先,定义一些必需的BiFunction&nbsp; BiFunction<Integer, int[], Integer> func = (a, b) ->&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i < b.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a *= b[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return Integer.valueOf(a);&nbsp; &nbsp; &nbsp; };现在定义一些数据。&nbsp; &nbsp; &nbsp; //Stream source&nbsp; &nbsp; &nbsp; int[] data = { 10, 20, 30&nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; // parameter source&nbsp; &nbsp; &nbsp; int[] params = { 3, 5, 11&nbsp; &nbsp; &nbsp; };&nbsp; &nbsp; &nbsp; Convert data to stream&nbsp; &nbsp; &nbsp; IntStream targets = Arrays.stream(data);现在应用映射函数。&nbsp; &nbsp; &nbsp;Map<Integer, Integer> results = targets.boxed().collect(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Collectors.toMap(t -> t, t -> func.apply(t, params)));&nbsp; &nbsp; &nbsp; System.out.println(results);上面的代码获取stream并创建一个映射,其中的数据充当该数据,keys然后获取这些相同的键并将它们应用于参数列表的功能。这成为地图的价值。根据初始流类型,您可能需要使用mapToObj或map代替上述方法。boxed()

蛊毒传说

功能接口(简单来说)是具有一种方法的接口。您可能想要注释接口以@FunctionalInterface记录其用途,并确保没有人意外添加其他方法。方法的名称并不重要,但当然应该适合它应该做的事情。因此,如果您需要一个具有 3 个参数的函数,请创建您自己的函数接口。您可以使用泛型类型参数使其具体化或通用化。@FunctionalInterfaceinterface TripleString {&nbsp; &nbsp; String doStringOp(String a, String b, String c);}@FunctionalInterfaceinterface TriFunction<T, U, V, R> {&nbsp; &nbsp; R apply(T t, U u, V v);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java