在Java流中重用相同的值
我正在尝试使用Java Streams一步一步地模拟一个等式。我有一个插件,可以让我在调试器的每个步骤中看到结果,这是我的最终目标。我还想测试修改特定数字会对输出产生什么影响 但是,我需要将第一个映射函数中使用的一个值重新用于最后一个映射函数,我不知道该如何做。我已经注释掉了我想做的事情,但是编译器发现它不正确 基本上,我正在测试以下数学函数在Java流中重用相同的值,java,math,functional-programming,java-stream,Java,Math,Functional Programming,Java Stream,我正在尝试使用Java Streams一步一步地模拟一个等式。我有一个插件,可以让我在调试器的每个步骤中看到结果,这是我的最终目标。我还想测试修改特定数字会对输出产生什么影响 但是,我需要将第一个映射函数中使用的一个值重新用于最后一个映射函数,我不知道该如何做。我已经注释掉了我想做的事情,但是编译器发现它不正确 基本上,我正在测试以下数学函数 ((2x+10)/2)-x=5 List<Month> months = new ArrayList<>(12); mo
((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();
对于您发布的示例,您不需要一个接一个地使用多个地图。只需做一个地图,完成所有这些计算(然后您将得到原始月份值) 如果您无论如何都想这样做,那么您将需要您的地图不返回单独的数字,而是一对月/tmp_值
没有专门用于存储对的java类,但是您可以使用Map.Entry(AbstractMap.SimpleEntry),或者更好地实现您自己的对类。对于发布的示例,您不需要一个接一个地使用多个映射。只需做一个地图,完成所有这些计算(然后您将得到原始月份值) 如果您无论如何都想这样做,那么您将需要您的地图不返回单独的数字,而是一对月/tmp_值
没有专门用于存储对的java类,但是您可以使用Map.Entry(AbstractMap.SimpleEntry),或者更好地,实现您自己的对类。如果您需要访问以前的
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);
如果您需要访问上一个
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);
这个等式和月份名称有什么关系?哦,对不起,
x=month.number
。不是名字,但我计划以后用这个月的名字。现在我只使用month.number
你有没有考虑过引入包装类来保持原始的x和当前步骤的计算结果?@VitalyZ我对函数编程相当陌生;以前只做过简单的贴图和过滤器。我不确定包装类会有什么帮助,因为在触发终止函数之前不会发生任何事情。如何存储该值?我正试着把头绕过去that@ChristopherRucinski请看这个等式和月份名称有什么关系?哦,对不起,x=month.number
。不是名字,但我计划以后用这个月的名字。现在我只使用month.number
你有没有考虑过引入包装类来保持原始的x和当前步骤的计算结果?@VitalyZ我对函数编程相当陌生;以前只做过简单的贴图和过滤器。我不确定包装类会有什么帮助,因为在触发终止函数之前不会发生任何事情。如何存储该值?我正试着把头绕过去that@ChristopherRucinski请看这个,我回家后会试试的。有道理。但我确实需要把它分开。一个插件会一步一步地告诉我发生了什么。作为一个map函数,我不能这样做,因为SDK中没有map
函数允许这样的返回值,所以我需要围绕流创建一个包装器(即MonthStream
)。是这样吗?我现在正在考虑创建这个MonthStream
,不需要那个流。在map方法上,您可以返回您想要的任何类,而不受任何限制。restriction仅在输入中,map将采用流中定义的元素。感谢最后的评论,这就是我要寻找的。另外一个问题是,如果没有这一对,有可能做到这一点吗?我只传递值,但我可以访问流中任何位置的月份?这是不是像我之前提到的MonthStream
?MonthStream会比你想要的更复杂。如果您不想创建一个Pair类,那么可以重用Abstract.SingleEntry类,它已经允许Pair(但我认为这是一个懒惰的把戏,因为这是用于映射的)。或者您可以返回一个int数组int[],将月份作为数组的第一个元素,将临时值作为第二个元素。int[]的问题是,从长远来看,它可能会导致混乱,不易维护,特别是如果它开始被其他功能忽略,我回家后会尝试。有道理。但我确实需要把它分开。一个插件会一步一步地告诉我发生了什么。作为一个map函数,我不能这样做,因为SDK中没有map
函数允许这样的返回值,所以我需要围绕流创建一个包装器(即MonthStream
)。是这样吗?我现在正在考虑创建这个MonthStream
,不需要那个流。在map方法上,您可以返回您想要的任何类,而不受任何限制。restriction仅在输入中,map将采用流中定义的元素。感谢最后的评论,这就是我要寻找的。另外一个问题是,如果没有这一对,有可能做到这一点吗?我只传递值,但我可以访问流中任何位置的月份?这是不是像我之前提到的MonthStream
?MonthStream会比你想要的更复杂。如果您不想创建一个Pair类,那么可以重用Abstract.SingleEntry类,它已经允许Pair(但我认为这是一个懒惰的把戏,因为这是用于映射的)。或者您可以返回一个int数组int[],将月份作为数组的第一个元素,将临时值作为第二个元素