2015-08-22 3 views
3

я определил этот поток:поток исключение броска в фильтре

public int sumNumbers(int[] numbers) { 
    return IntStream.of(numbers) 
      .filter(n -> n <= 1000) 
      .sum(); 
} 

Где я суммируя все целые числа, которые не выше 1000. Но теперь, что я хочу сделать, это, сгенерирует исключение, если любой элемент массива отрицательный.

Я знаю, как сделать это в старомодном режиме, но мне было интересно, если есть какой-то механизм с Stream и .filter() где я могу определить фильтр и случай исключения для этого фильтра

Просто для уточнения я хочу вызывать исключение и не контролировать исключение во время выполнения, как это делает другой вопрос.

Идея заключается в том, что если мой фильтр верно:

filter(n -> n < 0 throw Exception) 
+3

Почему бы не использовать 'n> = 0 && n <= 1000'? Кроме того, «Функциональный» по умолчанию не поддерживает сброс отмеченных исключений. –

+0

Требование - это исключение, чтобы сообщить неверные данные, что странно, что быть настолько мощным не позволяет что-то подобное. – paul

+1

@TagirValeev вы должны опубликовать этот комментарий в качестве ответа (кроме '.peek (n -> {if (n <0) throw new IllegalArgumentException (" "+ n);}' это то, что хочет OP) – Bohemian

ответ

5

Там находится в JDK, которая бесконтрольно и сообщает о неправильном входе функции IllegalArgumentException, поэтому он может быть использован здесь:

IntStream.of(numbers) 
     .peek(n -> { 
      if (n < 0) throw new IllegalArgumentException(String.valueOf(n)); 
     }) 
     .sum(); 

В целом, в настоящее время Java развивается в отношении исключенных исключений. В Java-8 добавлен класс UncheckedIOException!

Смежные вопросы