如何用Stream与Functional Interface实现数组含负数时抛出汇总异常?
使用Stream和函数式接口实现负数检查并抛异常
嘿,作为Stream和函数式接口的新手,能想到用它们来重构代码真的很棒!完全可以用它们来实现你的需求,而且代码会更简洁、更符合函数式编程的风格。
基础实现方式
首先,我们可以先通过Stream过滤出所有负数,收集到列表后再判断是否需要抛出异常,这和你原来的for循环逻辑一致,但代码更紧凑:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class NegativeCheckExample { public static void main(String[] args) { int[] input = {0, -1, -2}; // 过滤并收集所有负数 List<Integer> negatives = Arrays.stream(input) .filter(i -> i < 0) // 这里用到了Predicate函数式接口 .boxed() .collect(Collectors.toList()); // 判断并抛出异常 if (!negatives.isEmpty()) { throw new IllegalArgumentException("Invalid integers: " + negatives); } } }
这里的filter(i -> i < 0)其实就是实现了Predicate<Integer>这个函数式接口,这正是你提到的函数式接口的典型应用场景。
更具函数式风格的优化
如果你想让代码更贴合函数式编程的“流式操作”思路,可以用Collectors.collectingAndThen来把收集和异常检查合并到一个流操作里:
import java.util.Arrays; import java.util.stream.Collectors; public class NegativeCheckFunctional { public static void main(String[] args) { int[] input = {0, -1, -2}; Arrays.stream(input) .filter(i -> i < 0) .boxed() .collect(Collectors.collectingAndThen( Collectors.toList(), negativeList -> { // 这里用到了Function函数式接口 if (!negativeList.isEmpty()) { throw new IllegalArgumentException("Invalid integers: " + negativeList); } return negativeList; } )); } }
collectingAndThen的作用是在完成收集操作后,对收集结果执行一个后续处理函数(这里的lambda实现了Function<List<Integer>, List<Integer>>),这样我们就能把“收集负数”和“检查并抛异常”的逻辑整合到同一段流操作中,让代码的连贯性更强。
效果说明
运行上面的代码,当输入是[0, -1, -2]时,会抛出异常:
java.lang.IllegalArgumentException: Invalid integers: [-1, -2]
完全符合你的预期需求。
内容的提问来源于stack exchange,提问作者LOUDKING
相关产品推荐
相关产品推荐

