如何在J中映射lambda表达式

2024-10-02 00:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自Python,试图理解lambda表达式在Java中的工作方式是如何不同的。在Python中,可以执行以下操作:

opdict = { "+":lambda a,b: a+b, "-": lambda a,b: a-b, 
           "*": lambda a,b: a*b, "/": lambda a,b: a/b }
sum = opdict["+"](5,4) 

如何在Java中完成类似的任务?我读过一些关于javalambda表达式的文章,似乎我必须首先声明一个接口,我不清楚您需要如何以及为什么需要这样做。在

编辑:我试着用一个自定义接口来做这个。以下是我尝试过的代码:

^{pr2}$

但是,这会产生一个错误:

The target type of this expression must be a functional interface.

我应该在哪里声明接口?在


Tags: thelambda代码声明编辑target表达式错误
2条回答

在Java 8中使用^{}非常简单:

final Map<String, BiFunction<Integer, Integer, Integer>> opdict = new HashMap<>();
opdict.put("+", (x, y) -> x + y);
opdict.put("-", (x, y) -> x - y);
opdict.put("*", (x, y) -> x * y);
opdict.put("/", (x, y) -> x / y);

int sum = opdict.get("+").apply(5, 4);
System.out.println(sum);

当然,语法比Python要复杂一点,而且在opdict上使用getOrDefault可能会更好,以避免使用不存在的运算符的情况,但这至少会使问题得到解决。在

如果您专门使用ints,那么使用IntBinaryOperator将是更好的选择,因为这将处理您必须执行的任何泛型类型。在

^{pr2}$

另一种解决方案是使用枚举:

public enum Operation {
    PLUS((x, y) -> x + y),
    MINUS((x, y) -> x - y),
    TIMES((x, y) -> x * y),
    DIVIDE((x, y) -> x / y);

    private final IntBinaryOperator op;

    Operation(IntBinaryOperator op) { this.op = op; }

    public int apply(int x, int y) { return op.applyAsInt(x, y); }
}

然后您可以:

^{pr2}$

这不像其他解决方案那样简洁,但是使用枚举而不是String意味着当您在IDE中键入Operation.时,您将看到所有可能操作的列表。在

相关问题 更多 >

    热门问题