Stream.collect方法中适配EnumSet的正确Supplier实现及编译错误解决
问题解决:适配Stream.collect的EnumSet Supplier实现
错误原因
你调用的Stream.collect三参数重载方法,第一个参数要求是SupplierEnumSet.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
相关产品推荐
相关产品推荐

