Обычный рецепт для имитации вложенных циклов for
, которые управляют списком или массивом через индексы, заключается в использовании IntStream
вместе с flatMap
:
int[] input = {12, 7, 11, 15, 6, 2};
int target = 18;
List<List<Integer>> result = IntStream.range(0, input.length)
.boxed()
.flatMap(i -> IntStream.range(i + 1, input.length)
.filter(j -> input[i] + input[j] == target)
.mapToObj(j -> Arrays.asList(i, j)))
.collect(Collectors.toList());
System.out.println(result); // [[0, 4], [1, 2]]
Обратите внимание, что вам не нужноPair
класс для поддержания состояния из внутреннего потока во внешний поток, потому что вы можете применить необходимый фильтр к внутреннему потоку.
Кроме того, внутренний IntStream
не требуется для запуска на 0
, потому что вы не хотите, чтобы в результате были [i, j]
и [j, i]
(нужен только один из них).Так что начинать внутренний IntStream
с i + 1
достаточно.