Утверждения в потоках - PullRequest
       5

Утверждения в потоках

0 голосов
/ 16 ноября 2018

Я знаю, что могу отфильтровать поток, чтобы получить только те элементы, которые не равны NULL, и затем делать с ними все, что мне нужно.Примерно так:

myList.stream().filter(element -> element != null).doOtherThings...

Есть ли способ утверждать, что элементы не являются нулевыми в функции потока, так что он проходит через все элементы и, если он находит один из них нулевым, он генерирует исключение?Я думал о чем-то вроде следующего:

myList.stream().assert(Objects::nonNull).doOtherThings...

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Для метода карты я предпочитаю использовать метод Peek. Я думаю, что это более выразительно, чем метод карты, который должен возвращать какое-то значение.

    list.stream()
            .peek(Objects::requireNonNull)

Однако трудно понять, что поток не выполняется до тех пор, пока не будет вызван метод collect (). Вот почему делать такую ​​условную логику сложно с помощью потоков. Если честно, если вы хотите добиться желаемого эффекта, вам нужно сделать что-то вроде этого.

list.stream()
            .peek(Objects::requireNonNull)
            .collect(Collectors.toList())
            .stream()
            .map(t -> do whatever ... )
0 голосов
/ 16 ноября 2018

Уже есть несколько очень хороших предложений.Позвольте мне дополнить.Если то, что вы ищете, является утверждением, как в выражении assert, я хотел бы сделать это явным в коде, чтобы направить читателя относительно моей цели.Чтобы утверждать, что ваш исходный список не содержит null s:

    assert ! myList.contains(null);

Если утверждение должно быть проверено где-то вниз по конвейеру потока, простой способ:

    assert myList.stream().map(this::transform).allMatch(Objects::nonNull);

Если вы не хотите создавать отдельный поток для утверждения, но предпочитаете утверждать в середине существующего потокового конвейера, используйте, например:

        myList.stream()
                .peek(e -> { assert e != null; })
                .toArray();

Вы можете беспокоиться о том, что использование peek не очень хорошо, поэтому я и упоминаю этот вариант в последний раз.peek задокументировано, что он существует «главным образом для поддержки отладки» (цитата взята из его контекста), поэтому вы можете сказать, что он связан с целью assert и, таким образом, защищать его использование в этом случае.

0 голосов
/ 16 ноября 2018

Используйте что-то вроде

.map(Objects::requireNonNull)

Вам просто нужно применить операцию, которая сгенерирует исключение, но в противном случае передаст аргумент.

Хотя, если нет веской причины не повторять список несколько раз, может быть более понятным разделить проверку и обработку:

if (myList.stream().anyMatch(Objects::isNull)) {
  throw ...
}
// Do things with list.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...