具有可变参数的消费者
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 parameters
和varargs
。否则你会污染堆并得到 ClassCastExceptions
。如果你只是想处理Strings
,那么使用String
类型。如果 Objects
,使用 Object
类型。但不是您可能在其他方法中看到的某种类型 R
。
建议如下:
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 parameters
和varargs
。否则你会污染堆并得到 ClassCastExceptions
。如果你只是想处理Strings
,那么使用String
类型。如果 Objects
,使用 Object
类型。但不是您可能在其他方法中看到的某种类型 R
。