Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用参数可变计数的FunctionInterface实现_Java_Java 8 - Fatal编程技术网

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
方法通用吗,因此,每次调用该方法时都会指定类型。容器可以通过此类型参数化。事实上,这并没有使解决方案更容易