Преобразование тела итерационного цикла в функциональный код 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, так как он не допускает других приукрашиваний, таких как получение времени отклика. Возможно, здесь будет работать монада?

1 ответ

Решение

Это не хороший пример использования так называемых функций "функционального программирования", начиная с JDK8. Слишком много побочных эффектов и разных вещей происходит.

одна вещь, которую вы могли бы сделать, это использовать IntStream.range для цикла:

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

но я бы не советовал, ваш подход выглядит просто отлично.

Другие вопросы по тегам