Параллельно 100 выполнений без счетчика циклов с использованием Stream - PullRequest
0 голосов
/ 10 октября 2019

Можно ли удалить переменную i из следующего кода (поскольку он не используется)?

IntStream.range(0, 99).parallel().forEach(i -> {
    // do something without variable i
});

РЕДАКТИРОВАТЬ: Кто-нибудь знает другое представление для параллельного выполнения 100 раз? без ненужного счетчика циклов?

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Нет, вы не можете, потому что forEach принимает IntConsumer в качестве параметра и лямбда-выражение, которое вы предоставляете , должно быть совместимо с функциональным интерфейсом IntConsumer . Теперь посмотрите на метод accept интерфейса IntConsumer, он принимает один аргумент:

@FunctionalInterface
public interface IntConsumer {

    void accept(int value);

Итак, из приведенного выше кода вы можете видеть, что accept(int value) принимает аргумент.

0 голосов
/ 10 октября 2019

Нет, вы не можете удалить его. IntConsumer требует ввода int параметра.


Если в коде есть несколько мест, где вы хотите сделать одно и то же, вы можете использовать следующую технику вместо этого.

Создайте ExecutorService и определите вспомогательный метод для повторения команды:

public static ExecutorService service = Executors.newFixedThreadPool(4); // Or any executor service you want

public static void repeat(int times, Runnable command) {
    for (int i = 0; i < n; i++)
        service.execute(command);
    }
};

Затем используйте его следующим образом:

repeat(100, yourRunnable);
// or
repeat(100, () -> { /* do something here */ });

Метод repeat может бытьреализовано с использованием Stream API, но это не гарантирует параллельное выполнение ваших команд. С другой стороны, блокирует и будет ожидать выполнения всех команд. Это может быть полезно в некоторых случаях:

public static void repeat(int times, Runnable command) {
    IntStream.range(0, times).parallel().forEach(__ -> command.run());
};
...