Java中List.stream()调用.collect()方法报错,请求排查解决
问题排查与修复
你的代码核心问题是:调用mapToInt后得到的是原始类型的IntStream,而Collectors.toCollection、Collectors.toList这类收集器仅适用于对象类型的Stream<Integer>,原始类型流无法直接使用这些收集器,这就是IntelliJ报错的原因。
修复方案
在filter操作后添加boxed()方法,将IntStream转换为包装类型的Stream<Integer>,之后就能正常使用收集器了。
修复后的代码(使用toCollection)
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class PositiveNumbers { public static List<Integer> positive(List<Integer> numbers){ return numbers.stream() .mapToInt(Integer::valueOf) .filter(s -> s >= 0) .boxed() // 关键:将IntStream转为Stream<Integer> .collect(Collectors.toCollection(ArrayList<Integer>::new)); } }
简化版(使用toList)
import java.util.List; import java.util.stream.Collectors; public class PositiveNumbers { public static List<Integer> positive(List<Integer> numbers){ return numbers.stream() .mapToInt(Integer::valueOf) .filter(s -> s >= 0) .boxed() .collect(Collectors.toList()); } }
额外优化建议
其实你可以省略mapToInt步骤,直接对Stream<Integer>做过滤,代码更简洁且健壮:
import java.util.List; import java.util.stream.Collectors; public class PositiveNumbers { public static List<Integer> positive(List<Integer> numbers){ return numbers.stream() .filter(num -> num != null && num >= 0) // 增加非空判断避免空指针 .collect(Collectors.toList()); } }
内容的提问来源于stack exchange,提问作者testC0der
相关产品推荐
相关产品推荐

