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

Java中如何在keySet调用retainAll后直接链式调用size无需Lambda

问题原因

java.util.Collection接口定义的retainAll方法返回值为boolean类型,仅用来标记集合是否在本次操作中发生了内容变更,不会返回修改后的集合对象,因此你尝试的链式写法相当于对boolean值调用size()方法,自然无法通过编译。

无Lambda单行实现方案

按是否允许修改原phoneBook对象,有两种可选写法:

  • 允许修改原Map(和你给出的两行代码逻辑完全一致,原Map会丢失不在names数组里的键值对)
public static int countNames(Map<String, PhoneNumber> phoneBook, String[] names) {
    return (phoneBook.keySet().retainAll(Arrays.asList(names)), phoneBook.keySet()).size();
}

这里利用了Java的逗号表达式特性:括号内的代码会按顺序执行,最终返回最后一个表达式的值。

  • 不允许修改原Map(先复制Key集合再操作,不会影响原Map内容)
public static int countNames(Map<String, PhoneNumber> phoneBook, String[] names) {
    return new HashSet<>(phoneBook.keySet()) {{ retainAll(Arrays.asList(names)); }}.size();
}

这里用了双括号初始化语法,本质是创建HashSet的匿名子类,在初始化代码块中执行retainAll操作,全程没有用到Lambda表达式。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:06:04