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

时间:2018-12-02 23:21:44

标签: java java-8 functional-programming imperative-programming

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

它的工作方式是我捕获API调用前后的当前时间,然后从after中减去before。结果是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("\n");


    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在这里可以工作?

1 个答案:

答案 0 :(得分:2)

这不是使用JDK8以来所谓的“功能编程”功能的好例子。有太多的副作用,并且发生了不同的事情。

您可以做的一件事是在循环中使用IntStream.range

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

但是我不建议这样做,您的方法似乎还不错。