【问题标题】:stream and functional Interface: throw exception inside stream and aggregate them流和功能接口:在流中抛出异常并聚合它们
【发布时间】:2018-05-10 10:51:37
【问题描述】:

我是流和功能接口的新手,我想知道这个要求是否可以通过它们来完成。给定一个整数数组,如果其中任何一个为负数,则不处理而是抛出包含所有负整数的异常。

Example: INPUT = [0, -1, -2] 
EXPECTED Exception: invalid integers: (-1, -2).

我确实知道如何使用 for 循环来做到这一点,但我真的很好奇这是否可以通过流和函数式接口来实现。因此,我们将不胜感激。

int [] input = {0, -1, -2};
List<Integer> negatives = new LinkedList<>();

for (int i : input) {
    if (i < 0) {
        negatives.add(i);
    }
}

if (negatives.isEmpty() == false) {
    throw new IllegalArgumentException("Invalid integers: " + negatives);
}

【问题讨论】:

  • 您必须在有效流上运行什么样的处理?你能发布你的for循环吗?
  • 分享你将如何使用循环

标签: java java-8 functional-programming java-stream


【解决方案1】:

我会写一个简单的filter

final List<Integer> invalid = Arrays.asList(0, -1, -2).stream()
    .filter(i -> i < 0)
    .collect(Collectors.toList());

if (!invalid.isEmpty()) throw new RuntimeException("Invalid integers " + invalid);

【讨论】:

    【解决方案2】:

    你可以这样做

    public static void main(String[] args)  {
        List<Integer> list = Arrays.asList(1, 2, 3, -3, -2);
        checkList(list);
    }
    
    private static void checkList(List<Integer> list) {
        list.stream().filter(i -> i < 0).findFirst()
                .ifPresent(integer -> {
                    throw new IllegalArgumentException("Invalid are" + 
                                 Arrays.toString(list.stream().filter(i -> i < 0).toArray()));
                });
    }
    

    这会给你

    Exception in thread "main" java.lang.RuntimeException: Invalid are[-3, -2]
    

    【讨论】:

    • 您迭代了两次,这并不理想。如果列表有 10 亿个元素,而唯一的负数是最后一个呢?
    • @Michael 当然,但看不到如何在一行中完全流式传输
    • 哪里是“一行完成”的要求?为什么要在一行中进行 - 如果它的可读性较差并且效率较低 - 一件好事?
    • @Michael 不知道^^ 但显然他接受了我的,但我同意你的也很好,但我正在寻找一种不仅仅是收集和检查的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2013-03-14
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多