Преобразование тела итерационного цикла в функциональный код Java 8 - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу преобразовать приведенный ниже императивный код в функциональный код, используя 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 Ответ

0 голосов
/ 03 декабря 2018

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...