为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUH函数 2023-03-09 16:55:41
我有这种调用多个 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 时,我不确定究竟需要什么才能在我需要的功能中使用新接口。任何想法都会很棒。
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

修改以反映示例


首先,定义一些必需的BiFunction



  BiFunction<Integer, int[], Integer> func = (a, b) ->

      {

         for (int i = 0; i < b.length; i++) {

            a *= b[i];

         }

         return Integer.valueOf(a);

      };



现在定义一些数据。


      //Stream source

      int[] data = { 10, 20, 30

      };

      // parameter source

      int[] params = { 3, 5, 11

      };

      Convert data to stream

      IntStream targets = Arrays.stream(data);

现在应用映射函数。



     Map<Integer, Integer> results = targets.boxed().collect(

            Collectors.toMap(t -> t, t -> func.apply(t, params)));

      System.out.println(results);

上面的代码获取stream并创建一个映射,其中的数据充当该数据,keys然后获取这些相同的键并将它们应用于参数列表的功能。这成为地图的价值。


根据初始流类型,您可能需要使用mapToObj或map代替上述方法。boxed()


查看完整回答
反对 回复 2023-03-09
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

功能接口(简单来说)是具有一种方法的接口。


您可能想要注释接口以@FunctionalInterface记录其用途,并确保没有人意外添加其他方法。


方法的名称并不重要,但当然应该适合它应该做的事情。


因此,如果您需要一个具有 3 个参数的函数,请创建您自己的函数接口。您可以使用泛型类型参数使其具体化或通用化。


@FunctionalInterface

interface TripleString {

    String doStringOp(String a, String b, String c);

}


@FunctionalInterface

interface TriFunction<T, U, V, R> {

    R apply(T t, U u, V v);

}


查看完整回答
反对 回复 2023-03-09
  • 2 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信