将迭代循环体转换为功能代码Java 8

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将迭代循环体转换为功能代码Java 8相关的知识,希望对你有一定的参考价值。

我想使用Java 8将以下命令式代码转换为功能代码。

它的工作方式是我捕获API调用之前和之后的当前时间,然后我从之后减去之前的时间。结果是API执行所花费的大量时间,我也使用了内存。我将这个响应时间和内存使用数据收集到2个列表中然后我处理。

那么如何在转换为功能代码时保持当前的功能呢?

Simulator simulator = new Simulator();

List<Double> execTimes = new ArrayList<>();
List<Long> execMemory = new ArrayList<>();

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 1000; i++)
{
    Runtime runtime = Runtime.getRuntime();
    runtime.gc();

    Long startTime = System.currentTimeMillis();

    byte[] dataBytes = simulator.generateData(simulator.readFileAsString(input)); // API to measure

    long memoryUsed = runtime.totalMemory() - runtime.freeMemory(); // capture memory usage
    Long stopTime = System.currentTimeMillis();
    Long time = stopTime - startTime; // measure api response time

    sb.append(i).append(',').append(time)
      .append(',').append(memoryUsed).append(',').append("
");


    simulator.writeToFile(new File(inputDoc), dataBytes, i);

    execMemory.add(memoryUsed);
    execTimes.add(time.doubleValue());

    System.out.println("Execution time (MS): "+(time));
    System.out.println("Memory usage (B) ["+i+"]: "+memoryUsed);
}

这不起作用:

IntStream.range(0, 1000)
                    .forEach(i ->
                            simulator.generateData(simulator.readFileAsString(inputDoc)) );

我尝试使用该范围,但我不确定这是否是Integer Stream的正确使用案例,因为它不允许其他装饰,如捕获响应时间。也许monad会在这里工作?

答案

这不是使用JDK8中所谓的“函数编程”功能的好例子。有太多的副作用和不同的事情发生。

你可以做的一件事是使用IntStream.range作为循环:

IntStream.range(0, 1000).forEach(index -> {
   // logic here          
});

但我不推荐这个,你的方法似乎没问题。

以上是关于将迭代循环体转换为功能代码Java 8的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java 8中循环通过字节数组?

什么是蹦床功能?

将 ArrayList 嵌入式循环转换为迭代器

使用Java 8模式匹配将地图转换为列表

您如何将其转换为迭代函数而不是使用嵌套循环进行递归?

Java的迭代和foreach循环