Инкремент счетчика в потоке foreach Java 8

Я хотел бы AtomicInteger counter который является AtomicInteger когда я AtomicInteger через foreach

public class ConstructorTest {

public static void main(String[] args) {
    AtomicInteger counter = new AtomicInteger(0);
    List<Foo> fooList = Collections.synchronizedList(new ArrayList<Foo>());
    List<String> userList = Collections.synchronizedList(new ArrayList<String>());
    userList.add("username1_id1");
    userList.add("username2_id2");

    userList.stream().map(user -> new Foo(getName(user), getId(user))).forEach(fooList::add);
    //how do I increment the counter in the above loop

    fooList.forEach(user -> System.out.println(user.getName() + "   " + user.getId()));
}

private static String getName(String user) {
    return user.split("_")[0];
}

private static String getId(String user) {
    return user.split("_")[1];
}
}

Ответ 1

Зависит от того, где вы хотите увеличить.

Или

userList.stream()
        .map(user -> {
               counter.getAndIncrement();
               return new Foo(getName(user), getId(user));
            })
        .forEach(fooList::add);

или же

userList.stream()
        .map(user -> new Foo(getName(user), getId(user)))
        .forEach(foo -> {
            fooList.add(foo);
            counter.getAndIncrement();
        });

Ответ 2

также может быть сделано с помощью Stream.peek()

userList.stream()
    .map(user -> new Foo(getName(user), getId(user)))
    .peek(u -> counter.getAndIncrement())
    .forEach(fooList::add);

Ответ 3

Вы можете изменить его на анонимный класс:

        userList.stream().map(new Function<String, Object>() {
            @Override
            public Object apply(String user) {
                counter.addAndGet(1);
                return new Foo(getName(user), getId(user));
            }
        }).forEach(fooList::add);

Не забудьте сделать counter final.