在Java Stream中重用相同的值

时间:2017-08-06 05:09:46

标签: java math functional-programming java-stream

我正在尝试使用Java Streams逐步模仿方程式。我有一个插件,可以让我在调试器的每一步看到结果,这是我的最终目标。我还想测试修改特定数字对输出的作用

但是,我需要重用第一个映射函数中使用的一个值作为最后一个映射函数,我无法弄清楚如何去做。我已经评论了我想做什么,但编译器发现它不正确。

基本上,我正在测试以下数学函数......

((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;

    }
}

2 个答案:

答案 0 :(得分:2)

对于您发布的示例,您不需要一个接一个地使用多个地图。只需做一个完成所有计算的地图(然后你将得到原始月份值)。

如果你不想这样做,那么你需要你的地图不单独返回数字,而是返回一对月/ tmp_value。

没有专门用于存储对的java类,但您可以使用Map.Entry(AbstractMap.SimpleEntry),或者更好地实现自己的Pair类。

答案 1 :(得分: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);