Java 使用参数可变计数的FunctionInterface实现
在我的库中,我有一个简单的适配器接口来注册Java 使用参数可变计数的FunctionInterface实现,java,java-8,Java,Java 8,在我的库中,我有一个简单的适配器接口来注册 Adapter firstAdapter = new FirstAdapter(String someParam); Adapter secondAdapter = new SecondAdapter(int otherParam, String eventAnotherParam); something.register(firstAdapter) .register(secondAdapter); 其中适配器获取构造函数中的参数 我希望能
Adapter firstAdapter = new FirstAdapter(String someParam);
Adapter secondAdapter = new SecondAdapter(int otherParam, String eventAnotherParam);
something.register(firstAdapter)
.register(secondAdapter);
其中适配器获取构造函数中的参数
我希望能够使用FunctionInterface类型的适配器,但在这一部分中,我不知道需要在lambda中传递多少个参数,甚至是什么类型的适配器才能进行计算
有没有办法解决这个问题?我希望能够做到这样:
something.register(firstAdapter)
.register(secondAdapter)
.register((String whatever, String whateverElse) -> whatever.equalsTo(whateverElse))
.register((int i) -> i>5);
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]);
编辑{dsh}:
接口可以是这样的,但这并不重要,只是抽象:
@FunctionalInterface
interface Adapter {
boolean test();
}
interface Something {
Something register(Adapter adapter);
}
在幕后,瓦拉格将是一个阵列 因此,您可以将功能接口实现为:
@FunctionalInterface
public interface TestFunctionalInterface<T> {
public Boolean test(T... args);
}
请注意,这里我并没有列出每个lambda参数,而是将它们称为数组
当然,您可以将函数接口的输入/返回类型更改为更具体的类型,而不是使用泛型,如我的示例所示。接口/抽象类
适配器的定义是什么?它实际上是一个功能接口吗?(实现类的构造函数是无关的)什么是某物的类?具体来说,(每个)register()
方法的签名是什么?使用您添加到问题中的接口定义,您不能拥有您在问题中拥有的lambda:lambda将是Adapter
的匿名子类的一个实例,其唯一的方法accpets 0参数。你说接口无关紧要,只是它们对Java的lambda至关重要。我知道这一点。这就是我问这个问题的原因。A只是想要一些建议,就像科科在回答中所做的那样。这就是为什么我说界面并不重要。我再说一遍,这只是一个抽象概念,最终的结果可能看起来更不一样。我也想到了这一点。但老实说,这很难看。:-)另一种可能的解决方案是使用一组重载的register
方法,每个方法都将不同的函数接口作为参数。即使这个解决方案在代码清洁方面不是最好的,您也应该避免产生重复的或非常相似的代码。是的。我想到的另一个解决方案是使用刚性Something接口,只接受特定类型的对象并将其传递给适配器,例如:Something和Adapter。但这意味着要将适配器绑定到父级,我也不喜欢。我想到的第三个解决方案是将对象包装在某个容器中,因为它们的计数未知(例如,Set
,List
),而不是处理varargs。有趣的问题,是的……你能让register
方法通用吗,因此,每次调用该方法时都会指定类型。容器可以通过此类型参数化。事实上,这并没有使解决方案更容易