Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将代码从Java7转换为java8的问题_Java_Lambda_Java 8_Java Stream - Fatal编程技术网

将代码从Java7转换为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

我正试图用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("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();