2017-08-06 3 views
0

Javaストリームを使用して段階的に模倣しようとしています。デバッガの各ステップで結果を見ることができるプラグインがあり、それが私の最終目標です。特定の数値が出力に与える変更をテストしたい場合もあります。Javaストリーム内で同じ値を再利用

ただし、最後のマッピング関数で1番目のマッピング関数で使用されていた1つの値を再利用する必要があります。 。私は何をしたいのかコメントしましたが、コンパイラはそれが間違っていると判断します。

基本的に、私はちょうど明確にする...

((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は最初.map()xを表し、Iは2xmonth.number * 2)の結果を示しています。

また、ここではあなたがあなたが投稿たとえば複数のマップを1つずつ必要はありません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

ためのコードです。その計算をすべて行うマップを1つだけ実行します(そして、元の月の値を使用します)。

この方法でやりたければ、あなたのマップは数字だけを返すのではなく、月/ tmp_valueのペアを返す必要があります。

ペアを格納することを特に目的としたJavaクラスはありませんが、Map.Entry(AbstractMap.SimpleEntry)を使用するか、独自のPairクラスを実装することができます。

+0

私は帰宅するときにこれを試してみます。意味をなさないしかし、私はそれを分割する必要があります。プラグインは私に何が起こるかを段階的に示します。 1つのマップ関数としてはできません –

+0

SDKの 'map'関数はそのような戻り値を許さないので、Stream(つまり' MonthStream')の周りにラッパーを作成する必要があります。それは正しいです?この「MonthStream」を今作成しようとしています。 –

+0

そのストリームは必要ありません。マップメソッドでは、どんなクラスでも返すことができますが、制限はありません。制限は入力のみにあり、マップはストリームで定義された要素を使用します。 –

0

以前のmap()の変数にアクセスする必要がある場合は、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アプローチは同じですが、いくつかのステップで計算を実行するだけです。更新された回答を確認します。 –

関連する問題