java - 使用可变参数计数的 FunctionalInterface 实现

标签 java java-8

在我的库中,我有一个简单的适配器接口(interface)可以注册。

Adapter firstAdapter = new FirstAdapter(String someParam);
Adapter secondAdapter = new SecondAdapter(int otherParam, String eventAnotherParam);
something.register(firstAdapter)
    .register(secondAdapter);

适配器在构造函数中获取参数的地方。

我希望能够使用 FunctionalInterface 类型的适配器,但在这部分我不知道,有多少参数甚至是什么类型可能需要传递到 lambda 内部进行评估。

有什么办法可以解决这个问题吗?我希望能够做这样的事情:

something.register(firstAdapter)
    .register(secondAdapter)
    .register((String whatever, String whateverElse) -> whatever.equalsTo(whateverElse))
    .register((int i) -> i>5);

编辑 {dsh}:

接口(interface)可能是这样的,但这并不重要,它只是抽象:

@FunctionalInterface
interface Adapter {
  boolean test();
}

interface Something {
  Something register(Adapter adapter);
}

最佳答案

在幕后,可变参数将是一个数组。

因此您可以将功能接口(interface)实现为:

@FunctionalInterface
public interface TestFunctionalInterface<T> {
    public Boolean test(T... args);
}

然后像这样创建 lambda:

something.register(firstAdapter)
         .register(secondAdapter)
         .register((Integer[] x) -> (x[0] > 5))
         //or
         .register(x -> ((int) x[0] > 5)
         //or
         .register(x -> x[0].equals(x[1]);

请注意,我在这里没有列出每个 lambda 参数,而是将它们作为一个数组来引用。

当然,您可以将功能接口(interface)的输入/返回类型更改为更具体的内容,而不是使用泛型,如我的示例所示。

关于java - 使用可变参数计数的 FunctionalInterface 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31990168/

相关文章:

java - Java中比较字符串的三种不同方式

java - 使用 reduce(3 个参数)函数传递集合 - 流 java 8

java - 覆盖父类(super class)的实例变量

java - 原始 fragment 不会进入堆栈后面,它仍然可见

java - Android 照片上的 EXIF 方向字段为空

Java8 : Looking for a better way of parsing a text of "key: value" lines

java.lang.IllegalArgumentException : Not a managed type: class

java - 按每个月的最大值过滤日期的 TreeMap

java - Java 8 Eclipse 未设置 Root 错误

java - 有条件地构建 Maven fat jar