【问题标题】:Java - NavigableMap, which returns a functor, which returns a double [duplicate]Java - NavigableMap,它返回一个函子,它返回一个双精度[重复]
【发布时间】:2021-09-13 16:25:24
【问题描述】:

我来自 C++,我感到有点沮丧和困惑。我在谷歌上搜索了一段时间,但仍然找不到答案,所以我在这里。

我如何在 Java 中实现NavigableMap<String, ?>,其中问号处是一个对象,它可以用两个参数调用,然后返回一个值。

我希望它看起来像这样:

NavigableMap<String, SomeFunctorClass> container;

// I also don't know how to write a lambda thing in java, so it won't work.
// [](double a, double b) -> double { return a + b; } // in C++
container.put("add", (double a, double b) -> { return a + b; });

// Expected to be 10.
double result = container.get("add")(4, 6);

【问题讨论】:

  • 我想你想使用 BiFunction
  • 它说类型参数不能是原语:\
  • 哦,你写的是Double而不是double。给我一点时间。
  • “我在谷歌上搜索了一段时间,但仍然找不到任何答案” 真的吗?我尝试将java functor 放入搜索引擎(甚至不是谷歌!),我得到的第一个结果是this Stack Overflow question。它不回答问题吗?
  • 它仍然没有解决任何问题。

标签: java functor


【解决方案1】:

java中的等价物是BiFunction:

NavigableMap<String, BiFunction<Double, Double, Double>> container;
container.put("add", (a, b) -> a + b);

请注意,Java 中的泛型不能是原始的,因此您应该使用盒装版本(doubleDoubleIntegerint 等)

如果您需要超过 2 个参数(例如 TriFunction),那么您需要创建自己的接口,因为 Java 标准库不提供更多(它不如 C++ 可扩展)。

至于叫法:

// Expected to be 10.
double result = container.get("add").apply(4.0, 6.0);

【讨论】:

    【解决方案2】:

    Java 开箱即用的最接近的可能是BiFunction

    您仍然无法像在 C++ 仿函数上那样直接使用 () 调用它,但您可以调用它的 apply 方法:

    NavigableMap<String, BiFunction<Double, Double, Double>> container = new TreeMap<>();
    container.put("add", (a, b) -> a + b);
    double result = container.get("add").apply(4.0, 6.0);
    

    【讨论】:

      猜你喜欢
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 2010-10-05
      • 1970-01-01
      • 2016-05-20
      • 2018-07-13
      相关资源
      最近更新 更多