在Stream foreach Java 8中增加计数器

时间:2016-07-25 12:42:59

标签: java

当我使用counter

循环时,我想增加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]; } }
hover

5 个答案:

答案 0 :(得分:20)

取决于您想要增加的位置。

要么

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();
        });

答案 1 :(得分:3)

我们可以使用Atomic Integer的IncrementAndGet方法。

  AtomicInteger count=new AtomicInteger(0);

  list.forEach(System.out.println(count.incrementAndGet());

答案 2 :(得分:1)

也可以使用Stream.peek()

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

答案 3 :(得分:1)

如何使用

java.util.concurrent.atomic.AtomicInteger

示例:

AtomicInteger index = new AtomicInteger();

            actionList.forEach(action -> {
                   index.getAndIncrement();
            });

答案 4 :(得分:-2)

您可以将其更改为匿名类:

        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