我有一个如下的示例代码,我可以编写它并知道它的工作方式。 但是我仍然很难理解使用java ::将某物转换为典型方法的java。
.collect(ConcurrentHashMap::newKeySet,Set::add,Set::addAll)
第一个参数是Supplier<R> supplier
,我可以理解,就像有一个get()
方法与ConcurrentHashMap::newKeySet
具有相同实现的Supplier实例一样。
第二个和第三个参数是'BiConsumer',如果我使用lambda表达式,我将编写类似(a,b)->a.add(b)
的内容。当我写Set::add
时,他们怎么知道先将参数a转换为Set,然后在其上调用add()
方法。
BiConsumer的定义是具有两个参数的简单方法。
如果有类似的东西,我将不难理解:
Set<String> set = new HashSet<>();
Consumer<String> consumer = set::add;
我只是不明白他们怎么知道要在第一个参数上调用add方法。