2016-07-25 82 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