2016-07-25 55 views
3

递增计数器,我想增加一个counter这是一个AtomicInteger,我通过循环使用foreach在流的foreach的Java 8

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]; 
} 
} 

回答

6

取决于您想增加的位置。

要么

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

谢谢@bradimus。我做了第二个,它的工作。我的问题的目的是看看我是否可以将'Method Reference'与另一个方法调用结合起来。猜猜这是不可能的。我会接受你的回答:) –

0

你可以把它改成一个匿名类:

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

记得制作counterfinal

+3

为什么要创建一个匿名类时,一个简单的拉姆达就足够了? – bradimus

+0

@bradimus - 没有真正的理由 - 当你发布你的答案时,它比我的好,但我的建议另一种选择,所以我把它留在这里。顺便说一句 - 你应该添加关于使计数器最终的注意事项。 – OldCurmudgeon