2017-07-27 44 views
0

我想通過反覆發射隨機數來模擬測量數據。我試着用反應堆做到這一點,但它不會產生任何輸出:如何使用Reactor創建隨機數生成器?

private static Random random = new Random(); 

public static void main(String[] args) throws InterruptedException { 
    Flux<Double> doubleGenerator = Flux.generate(
      () -> random.nextDouble(), 
      (ignored, sink) -> { 
       sink.next(random.nextDouble()); 
       return 0.0; 
      }); 
    Flux<Long> timer = Flux.intervalMillis(1000); 
    Flux.combineLatest(doubleGenerator, timer, (value, ignored) -> value) 
      .subscribe(System.out::println); 
} 

如何創建與反應堆冷卻隨機值流?

+1

「但它不起作用」 - >請描述它如何不起作用。你預期會發生什麼以及發生了什麼。 –

+1

你說得對。在這種情況下,我看不到任何輸出,程序似乎無限運行。 – deamon

+0

嘗試在調用'combineLatest'時切換'doubleGenerator'和'timer'的順序,並在其後添加一個Thread.sleep以停止虛擬機終止,並得到一些結果 - 但它仍然不是你想要的。 –

回答

3

我解決了這個反應堆使用3.1這樣Flux.intervalMillis(long)已經在下面我的解決方案改爲Flux.interval(Duration)。從本質上講,我創建了一個Flux,它以一定的間隔(我的例子是每秒一次)發射一個數字,然後將其映射到一個隨機數。

final Random random = new Random(); 
Flux.interval(Duration.ofSeconds(1)) 
     .map(pulse -> random.nextDouble()) 
     .subscribe(System.out::println); 
Thread.sleep(5000); 

我只是做了我的例子在一個普通的main()方法,所以爲了使磁通實際上是足夠長的時間發射數據,我補充睡眠。

-3

不知道爲什麼你想這樣,但你可以嘗試生成UUID

UUID.randomUUID()

,並刪除破折號,相當長的十六進制數,總是不同的。

編輯。

如果你想只是小數,你可以嘗試:

String lUUID = String.format("%040d", new BigInteger(UUID.randomUUID().toString().replace("-", ""), 16)); 
+1

這並不重要,生成什麼,但如何用反應堆的手段來執行它。 – deamon