Дипак,
Ничего не происходит означает, что данные не будут передаваться по цепочке ваших функций вашим потребителям, пока не произойдет подписка.
Вы получаете NPE
потому что Java пытается вычислить значение, которое присваивается оператору hot just()
на шаге определения потока.
Вы также можете преобразовать just()
в cold operator с использованием defer()
, поэтому вы получите NPE
только после подписки:
public Flux<String> test() {
String a = null;
return Flux.defer(() -> Flux.just(a.toLowerCase()))
.doOnNext(System.out::println);
}
Пожалуйста, прочитайте больше о hot vs hold операторов.
Обновление:
Небольшой пример холодных и горячих издателей. Каждый раз, когда происходит новая подписка, тело холодного издателя пересчитывается. Между тем, just()
производит только время, которое было вычислено только один раз во время определения.
Mono<Date> currentTime = Mono.just(Calendar.getInstance().getTime());
Mono<Date> realCurrentTime = Mono.defer(() -> Mono.just(Calendar.getInstance().getTime()));
// 1 sec sleep
Thread.sleep(1000);
currentTime.subscribe(time -> System.out.println("Current Time " + time.getTime()));
realCurrentTime.subscribe(time -> System.out.println("Real current Time " + time.getTime()));
Thread.sleep(2000);
currentTime.subscribe(time -> System.out.println("Current Time " + time.getTime()));
realCurrentTime.subscribe(time -> System.out.println("Real current Time " + time.getTime()));
Выход:
Текущее время 1583788755759
Реальное текущее время 1583788756826
Текущее время 1583788755759
Реальное текущее время 1583788758833