Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Циклоп-реакция (я являюсь автором этой библиотеки), предоставляет класс StreamUtils для обработки потоков. Одной из функций, которые он предоставляет, является futureOperations, который обеспечивает доступ к стандартным операциям терминала Stream (а затем и к некоторым) с поворотом - поток выполняется асинхронно, а результат возвращается внутри CompletableFuture. .eg
Stream<Integer> stream = Stream.of(1,2,3,4,5,6)
.map(i->i+2);
CompletableFuture<List<Integer>> asyncResult = StreamUtils.futureOperations(stream,
Executors.newFixedThreadPool(1))
.collect(Collectors.toList());
Существует также удобный класс ReactiveSeq, который упаковывает Stream и обеспечивает те же функциональные возможности, с приятным беглым API
CompletableFuture<List<Integer>> asyncResult = ReactiveSeq.of(1,2,3,4,5,6)
.map(i->i+2)
.futureOperations(
Executors.newFixedThreadPool(1))
.collect(Collectors.toList());
Как указал Адам циклопов -react FutureStreams предназначены для асинхронной обработки данных (путем смешивания Futures и Streams) - он особенно подходит для многопоточных операций, которые включают блокировку ввода-вывода (например, чтение файлов, выполнение вызовов db, выполнение вызовов rest и т. д. ).