具有可变参数的消费者

Consumer with varargs

建议如下:

  Consumer<Object[]> consumer = (args) -> { /* Do something */ }

要使用消费者,我必须创建一个对象数组。所以,我必须写 像

  consumer.accept(new Object[]{ object0, object1, ... });

显然,我更喜欢

  Consumer<Object...> consumer = (args) -> { /* Do something */ }
  consumer.accept(object0, object1, ...);

这样的事情可能吗?

变量参数 (varargs)是一个句法元素,一个特殊的标记,表示一个方法(或构造函数 ) 需要 0 或更多该类型的参数。当方法被执行时,这些参数将被一个数组包裹(所以从技术上讲它们将构成一个参数)。

它的用法有限制:一个方法只能有一个可变参数,必须定义在最后一个位置。

变量参数本身不是一个类型。如果您尝试在方法(构造函数)声明的最后位置以外的任何位置使用 eclipses ...,您将收到编译错误(take a look at JLS for more information ).

为了在函数中使用可变数量的参数,您可以定义一个函数式接口,其中包含一个可变元数的方法。而这个方法是唯一需要使用省略号...的地方。

@FunctionalInterface
public interface MyConsumer<T> {
    void accept(T... items);
}
MyConsumer<String> myConsumer = items -> Stream.of(items).forEach(System.out::println);

myConsumer.accept("A", "B", "C");

将给出输出:

A
B
C

但您可以创建自己的功能界面如下:


interface IntVarArgsConsumer {
        void accept(int ...s);
}
    
IntVarArgsConsumer printArray = arr-> System.out.println(Arrays.toString(arr));
        
printArray.accept(1,2,3,4,5);
printArray.accept(1,2,3);

打印

[1, 2, 3, 4, 5]
[1, 2, 3]

但我提醒您不要混合使用generic type parametersvarargs。否则你会污染堆并得到 ClassCastExceptions。如果你只是想处理Strings,那么使用String类型。如果 Objects,使用 Object 类型。但不是您可能在其他方法中看到的某种类型 R