BiConsumer<String, BiConsumer<Boolean,Integer>> 类型声明了一个BiConsumer,也就是说,一个消费者消费了 2 个,而且只有 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);
或者,您可以通过声明一个Function 来使用currying,该String 将返回双向消费者:
Function<String, BiConsumer<Boolean,Integer>> f = s -> (b, i) -> System.out.println(s+b+i);
f.apply("foo").accept(true, 1);