2017-08-06 56 views
0

我正嘗試使用Java Streams逐步模擬方程。我有一個插件,可以讓我在調試器的每一步看到結果,這是我的最終目標。我也想測試什麼修改具體數字會做輸出在Java流中重用相同的值

但是,我需要重用一個值在第一個映射函數用於最後的映射函數,我不知道該怎麼做。我已經評論了我想做什麼,但是編譯器發現它不正確。

基本上,我測試下面的數學函數...

((2x + 10)/2) - x = 5

List<Month> months = new ArrayList<>(12); 

    months.add(new Month(1, "January")); 
    months.add(new Month(2, "February")); 
    months.add(new Month(3, "March")); 
    months.add(new Month(4, "April")); 
    months.add(new Month(5, "May")); 
    months.add(new Month(6, "June")); 
    months.add(new Month(7, "July")); 
    months.add(new Month(8, "August")); 
    months.add(new Month(9, "September")); 
    months.add(new Month(10, "October")); 
    months.add(new Month(11, "November")); 
    months.add(new Month(12, "December")); 

    months.stream()          // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 
      .map((month) -> month.number * 2)    // 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24 
      .map((product) -> product + 10)    // 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34 
      .map((sum) -> sum/2)       // 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 
    // --> .map((quotient) -> quotient - month.number) // 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 
      .toArray(); 

只是要清楚,我想重用month.number值。

編輯 只是要清楚,month.number代表x與第一.map(),我顯示的2xmonth.number * 2)的結果。

而且,這裏是Month

private class Month { 

    int number; 
    String name; 

    public Month(int month, String name) { 

     this.number = month; 
     this.name = name; 

    } 
} 
+0

這是什麼* *方程有一個月的名字呢? –

+0

對不起,'x = month.number'。不是名字,但我打算以後再使用月份名稱。現在我只是使用'month.number' –

+0

你有沒有考慮引入包裝類,以保持原來的x以及當前步驟的計算結果? – VitalyZ

回答

2

的代碼你不需要幾個地圖一個其他爲您發佈的例子之後。只需做一張地圖即可完成所有計算(然後您將獲得原始月份值)。

如果您無論如何都想這樣做,那麼您將需要您的地圖不會單獨返回數字,而是一對月/ tmp_value。

沒有專門用於存儲對的java類,但是您可以使用Map.Entry(AbstractMap.SimpleEntry),或者更好地實現您自己的Pair類。

+0

我會嘗試這個,當我回家。說得通。但我確實需要把它分開。一個插件會一步一步向我展示發生了什麼。我不能做到這一點作爲一個地圖功能 –

+0

我需要圍繞流(即'MonthStream')創建一個包裝,因爲SDK中沒有'map'函數允許這樣的返回值。那是對的?我正在尋找創建這個'MonthStream'現在 –

+0

不需要那個流。在地圖方法上,你可以返回你想要的任何類,沒有限制。限制僅在輸入中,map將採用流中定義的元素。 –

0

如果您需要訪問以前的map() s的變量,這意味着您不必要地將map()呼叫分開。一步

months.stream()         
    .map(m -> ((m.number * 2) + 10)/2 - m.number)    
    .toArray(Integer[]::new); 

或步:你可以在一個單一的一個一切

months.stream()          
    .map(m -> { 
     int product = m.number * 2; 
     int sum = product + 10; 
     int quotient = sum/2; 
     int result = quotient - m.number; 
     return result; 
    }).toArray(Integer[]::new); 
+0

如果我不關心逐步的結果(如前2個句子所示),那麼這將是我會做什麼。 –

+0

@ChristopherRucinski的方法是一樣的,只需要幾步執行計算。檢查更新的答案。 –