类型
BiConsumer<String, BiConsumer<Boolean,Integer>>
声明了一个
BiConsumer
,即消费者只消费 2 个参数。这两个参数中,一个声明为类型
String
,而另一个声明为类型
BiConsumer<Boolean,Integer>
。
因此,以下代码可以编译通过:
BiConsumer<String, BiConsumer<Boolean,Integer>> cc2 = (s, c) -> {};
s
的类型将会是 String
,而 c
的类型将会是 BiConsumer
。需要捕获 c
的参数,并且它们不会成为 Lambda 参数。
然而这并不是你想要的:你实际上想要消费 3 个参数,而不是 2 个。没有内置的函数式接口可以满足这个需求,但你可以创建自己的函数式接口:
@FunctionalInterface
interface TriConsumer<A,B,C> {
void accept(A a, B b, C c);
}
接下来,您可以与它一起使用。
TriConsumer<String,Boolean,Integer> tri = (s, b, i) -> System.out.println(s+b+i)
另外,您可以利用柯里化,通过声明一个接受String
并返回双消费者的Function
来实现:
Function<String, BiConsumer<Boolean,Integer>> f = s -> (b, i) -> System.out.println(s+b+i)
f.apply("foo").accept(true, 1)