我正在尝试使用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()
,我显示了2x
(month.number * 2
)的结果。
此外,这是Month
private class Month {
int number;
String name;
public Month(int month, String name) {
this.number = month;
this.name = name;
}
}
答案 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);