получить индекс на java8 после сбора - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующий фрагмент кода, который я хочу перевести, используя потоковый API Java 8.

count = 0;
for (A a : someList) {
   if (a.get() == 1) {
     count++;
     newList.add(new X(count));
   }
}

Как получить этот счетчик при отображении?

newList = someList.stream
.filter(a -> a.get().equals("red"))
.map(a -> new X(count))
.collect(Collectors.toList());

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Я думаю, это может сработать;

AtomicInteger count = new AtomicInteger(0);
newList = someList.stream
.filter(a -> a.get().equals("red"))
.map(a -> new X(count.getAndIncrement()))
.collect(Collectors.toList());
0 голосов
/ 25 апреля 2018

Версия цикла for лучше подходит для логики этого типа, но если вы действительно хотите использовать потоки, я бы упростил жизнь и сделал бы это в два шага, вместо того чтобы пытаться сбросить все логика в конвейер с одним потоком, что может привести к снижению читабельности кода

int count = (int)someList.stream()
                         .filter(a -> a.get().equals(“red”))
                         .count();

IntStream.rangeClosed(1, count)
         .mapToObj(X::new)
         .collect(toList());

Как уже упоминалось, это ни в коем случае не лучше, чем версия цикла for, но здесь для иллюстрации, иногда при использовании потоков лучший подход - выполнить несколько проходов, а не пытаться вписать все в один конвейер.

0 голосов
/ 25 апреля 2018

Заменить a -> new X(count) на a -> new X(++count).Оператор ++ увеличивает переменную, в данном случае count, и возвращает старое значение, если оно находится после переменной, или новое значение, если оно находится перед переменной.

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