将代码从Java7转换为java8的问题
我正试图用Java8-将代码从Java7转换为java8的问题,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我正试图用Java8- Scanner sc = new Scanner(System.in); System.out.println("Enter the policy amount: "); long amount = sc.nextInt(); System.out.println("Enter the interest: "); int interest = sc.nextInt(); System.out.println("Ente
Scanner sc = new Scanner(System.in);
System.out.println("Enter the policy amount: ");
long amount = sc.nextInt();
System.out.println("Enter the interest: ");
int interest = sc.nextInt();
System.out.println("Enter the number of years: ");
int years = sc.nextInt();
sc.close();
for (int i = 1; i <= years; i++) {
result = nextYear + amount;
calculateInterest = result * interest / 100;
nextYear = result + calculateInterest;
}
return nextYear;
但是,不确定如何返回nextYear值。如何处理这个问题,或者是否有其他方法来处理这个问题。请建议。谢谢。理论上,您可能希望使用
reduce
,默认值为0
。BinaryOperator
的left
将是定期更新的值,而right
值保持未使用状态(它表示代码段中的年份-i
或num
)
。。或更具可读性:
double nextYear = IntStream.rangeClosed(1, years)
.mapToDouble(i -> (double) i)
.reduce(0.0, (left, right) -> {
double result = left + amount;
return result + ((result) * interest / 100);
});
注意:我对您的nextYear
、result
和calculateInterest
变量的类型感到非常困惑。您可能需要更改mapToDouble
或上面代码段中使用的类型
注意2:但是,正如前面所说,for循环在Java8之前可用,甚至在Java8之后也可用,所以没有理由停止使用它
注3:您确定计算正确吗?由于您的结果只是重复应用循环体,因此通过流API获得该结果的方法是通过静态方法,该方法允许您生成一个类似于函数重复应用的流 如果我们对循环体进行变换,我们得到:
return LongStream.iterate(0, nextYear -> {
long result = nextYear + amount;
long calculateInterest = result * interest / 100;
return result + calculateInterest;
})
.skip(years)
.findFirst()
.getAsLong();
使用一些算法,我们可以简化lambda函数体。通过内联result
和calculateInterest
我们只得到一行:
nextYear -> {
return (nextYear + amount) + (nextYear + amount) * interest / 100;
}
通过消除主体并通过分组重构方程,我们得到
nextYear -> ((nextYear + amount) * (100 + interest)) / 100
因此,最终的转换如下所示:
return LongStream.iterate(0,
nextYear -> ((nextYear + amount) * (100 + interest)) / 100
)
.skip(years)
.findFirst()
.getAsLong();
为什么你需要一个for循环呢?必须有一个计算利息的公式。你想计算吗?以防万一,如果不是利息计算,一般来说我们怎么做?请帮忙。通常这是一个减少手术。但通常,当你只是有一个循环时,你不会减少,而是当你打算根据流的内容来计算结果时。Java 8(甚至16)仍然允许
进行循环。。。他们没什么问题。我只会使用streams
,如果代码可以用streams
更好地表达(或者为了好玩/测试)-非常基于观点,你不需要使用double
,也就是说,你可以将I->(double)I
写成I
。谢谢,这是一个很好的解释。非常感谢,这很有效。
nextYear -> ((nextYear + amount) * (100 + interest)) / 100
return LongStream.iterate(0,
nextYear -> ((nextYear + amount) * (100 + interest)) / 100
)
.skip(years)
.findFirst()
.getAsLong();