将迭代循环体转换为功能代码 Java 8
Converting iteration loop body into functional code 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("\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 会在这里工作?
这不是使用 JDK8 中所谓的 "functional programming" 特性的好例子。有太多的副作用和不同的事情正在发生。
你可以做的一件事是使用 IntStream.range
作为循环:
IntStream.range(0, 1000).forEach(index -> {
// logic here
});
但我不推荐这样做,你的方法似乎还不错。
我想使用 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 的正确用例,因为它不允许其他修饰,例如限制响应时间。也许 monad 会在这里工作?
这不是使用 JDK8 中所谓的 "functional programming" 特性的好例子。有太多的副作用和不同的事情正在发生。
你可以做的一件事是使用 IntStream.range
作为循环:
IntStream.range(0, 1000).forEach(index -> {
// logic here
});
但我不推荐这样做,你的方法似乎还不错。