I ++ в методе карты java-stream

В коде я хочу изменить переменную i методом map():

Integer[] seq = {1, 3, 4, 1, 8, 11};

List<Integer> seqInt = Arrays.asList(seq);
List<Integer> seqFiltered = seqInt.stream().filter(i -> i%2!=0)
                                      .map(i -> i++)
                                      .collect(Collectors.toList());
System.out.println(seqFiltered);

Однако он выводит [1, 3, 1, 11] вместо [2, 4, 2, 12], который можно получить из map(i -> i+1).

В дополнение к ответу нулевого указателя для более подробной информации: Есть ли разница между x ++ и ++ x в java?

Malte Hartwig 10.09.2018 14:21
2
1
90
1

Ответы 1

Просто используйте оператор пре-инкремента вместо пост-инкремента.

List<Integer> seqFiltered = seqInt.stream()
                                  .filter(i -> i%2!=0)
                                  .map(i -> ++i)
                                  .collect(Collectors.toList());

Кроме того, вы можете использовать Arrays.stream для использования массива Integer в качестве потока

List<Integer> seqFiltered = Arrays.stream(seq)
                                  .filter(i -> i % 2 != 0)
                                  .map(i -> ++i)
                                  .collect(Collectors.toList());

Было бы более интуитивно (на мой взгляд) использовать вместо этого map(i -> i + 1), тем более, что i отброшен, поэтому побочный эффект оператора предварительного приращения (также увеличивающий i) не используется вообще

Mark Rotteveel 10.09.2018 16:23

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