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

Stream.collect方法中适配EnumSet的正确Supplier实现及编译错误解决

问题解决:适配Stream.collect的EnumSet Supplier实现

错误原因

你调用的Stream.collect三参数重载方法,第一个参数要求是Supplier(一个无参函数,负责生成新的容器实例),但你直接传入了EnumSet.noneOf(ScConstraint.class)返回的EnumSet实例,类型不匹配,导致编译报错。

正确实现方式

方式1:直接传递Supplier Lambda

把第一个参数替换为返回空EnumSet的Supplier lambda表达式:

HashSet<Integer> nlsCandidates;
EnumSet<ScConstraint>[] rowConstraints;
EnumSet<ScConstraint> tbd = nlsCandidates.stream()
    .flatMap(p -> rowConstraints[10*k + p].stream())
    .filter(cstr -> !s.contains(cstr.RC))
    .collect(() -> EnumSet.noneOf(ScConstraint.class), (c, cstr) -> c.add(cstr), EnumSet::addAll);

这里() -> EnumSet.noneOf(ScConstraint.class)就是符合要求的Supplier,每次调用都会生成一个新的空EnumSet实例。

方式2:使用Collectors.toCollection(更简洁)

Java的Collectors工具类提供了toCollection方法,可以直接传入Supplier来指定收集目标集合,代码更简洁:

import java.util.stream.Collectors;

// ...

EnumSet<ScConstraint> tbd = nlsCandidates.stream()
    .flatMap(p -> rowConstraints[10*k + p].stream())
    .filter(cstr -> !s.contains(cstr.RC))
    .collect(Collectors.toCollection(() -> EnumSet.noneOf(ScConstraint.class)));

这种方式利用预定义的Collector,可读性和维护性更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:15:48