前言
Set.ofLazy是JDK 27 预览特性 JEP 531:Lazy Constants,该方法用于创建一个惰性不可变 Set 。与传统的 Set.of() 在创建时立即初始化所有元素不同,Set.ofLazy() 允许将"元素是否存在于集合中"或"元素的计算"延迟到首次访问时才执行。
Set.ofLazy使用
csharp
public class SetOfLazyDemo {
static void main() {
AtomicInteger calls = new AtomicInteger();
// 只保留长度 > 3 的名字;谓词不会在构造时执行
Set<String> users = Set.ofLazy(Set.of("alice", "bob", "charlie"), name -> {
calls.incrementAndGet();
return name.length() > 3;
});
System.out.println("构造后谓词执行次数: " + calls.get()); // 0:惰性,啥都没算
System.out.println("contains("bob"): " + users.contains("bob")); // false:只判定 bob 一次
System.out.println("谓词执行次数: " + calls.get()); // 1
System.out.println(users); // 含 alice/charlie,顺序不保证(Set.of 无序)
System.out.println("最终谓词执行次数: " + calls.get()); // 3:每元素至多一次
}
}
输出结果为

总结
JDK27提供了Set.ofLazy,但是目前该特性属于预览阶段,可以先试试看咋样,目前不建议在生产环境使用