Проблема, которую я получаю, заключается в том, что большую часть времени я получаю ошибку NullPointerException, и я думаю, что это из-за .count () И я пришел к такому выводу, если я запустил его с out .count () это не вызовет исключения.
Причина, по которой вы не можете реплицировать NullPointerException
без вызова count
, состоит в том, что потоки лениво оцениваются , т.е. весь конвейер не выполняется до тех пор, пока не будет выполнена активная операция (операция который запускает обработку конвейера).
Мы можем прийти к выводу, что Arrays.stream(array)
не является виновником NullPointerException
, потому что он взорвался бы независимо от того, вызвали ли вы активную операцию в потоке или нет в качестве параметра для Arrays.stream
должно быть nonNull , иначе он вылетит из-за вышеупомянутой ошибки.
Таким образом, мы можем прийти к выводу, что элементы внутри массива являются виновниками для эта ошибка в коде, который вы проиллюстрировали, но затем вы должны спросить себя, разрешены ли в первую очередь нулевые элементы, и если да, то отфильтруйте их перед выполнением c.contains("something")
, а если нет, то вам следует отладить, в какой момент в вашем приложении были нули добавляются в массив, когда их не должно быть. Найдите ошибку, а не подавите ее.
если нули разрешены в первую очередь , решение простое, т.е. отфильтровать нули перед вызовом .contains
:
int counter = (int)stream.filter(Objects::nonNull)
.filter(c -> c.contains("something")) // or single filter with c -> c != null && c.contains("something") as pred
.count();