【问题标题】:Converting iteration loop body into functional code Java 8将迭代循环体转换为功能代码 Java 8
【发布时间】:2018-12-02 23:21:43
【问题描述】:

我想使用 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("\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 的正确用例,因为它不允许其他修饰,例如缩短响应时间。也许单子会在这里工作?

【问题讨论】:

  • StringBuilder 好像没什么用。

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


【解决方案1】:

这不是一个很好的例子来使用JDK8 中所谓的“函数式编程”特性。有太多的副作用和不同的事情发生。

您可以做的一件事是使用IntStream.range 进行循环:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2021-09-16
    相关资源
    最近更新 更多