You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何HashSet::add可作为ObjIntConsumer参数传入IntStream的collect方法

这个问题的核心是Java 8及以上版本中类名::实例方法形式的方法引用的隐式参数匹配规则,具体逻辑如下:

1. 签名匹配的本质

你提到的ObjIntConsumer<R>的accept方法要求传入两个参数:第一个是R类型的容器实例,第二个是int类型的流元素。而HashSet::add属于「类名指向实例方法」的方法引用,这种形式的引用会自动把函数式接口抽象方法的第一个入参,作为实例方法的调用对象,剩余的入参按顺序传给实例方法。
也就是说HashSet::add在这里等价于如下Lambda表达式:

(set, value) -> set.add(value)

你可以看到这个Lambda刚好接收两个参数,完全符合ObjIntConsumer的accept方法的参数要求。

2. 返回值兼容规则

另外HashSet.add方法的返回值是boolean,而accept方法要求返回void,这种场景下Java会自动忽略方法的返回值,不会触发签名不匹配的报错。
你可以直接用上面的Lambda替换代码里的HashSet::add,运行效果完全一致:

IntStream.range(1, 100)
    .collect(HashSet::new, (set, val) -> set.add(val), HashSet::addAll);

3. 同类场景扩展

这种隐式绑定调用对象的方法引用非常常见,比如String::length等价于(s) -> s.length(),List::add等价于(list, elem) -> list.add(elem),都是同样的匹配逻辑。

内容的提问来源于stack exchange,提问作者al pal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:04