Java forEach是一個對collection或者stream迭代以及對其中的每一個元素執行某個動做的實用方法。java
下面的代碼片斷展現了在Iterable interface中java forEach方法的默認實現。這樣能夠使除了Map類以外的全部collection類使用它。bash
該方法將會對每一個迭代元素執行給定的動做,直到全部元素被處理完畢或者動做拋出了一個異常。ide
action表明一個接受單個輸入參數而且不返回任何值的操做。它是Consumer
interface的一個實例。ui
// Iterable.java
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
複製代碼
一個定製的action能夠用以下的簡單語法生成。在這裏Object
類型將會被collection或者stream裏的元素類型替代。this
Consumer<Object> action = new Consumer<Object>()
{
@Override
public void accept(Object t) {
//perform action
}
};
複製代碼
在這個例子當中,咱們將打印全部偶數。spa
// 在stream元素上執行的Java 8 forEach
ArrayList<Integer> numberList = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Consumer<Integer> action = System.out::println;
numberList.stream().filter(n -> n%2 == 0).forEach( action );
複製代碼
程序輸出:code
2
4
複製代碼
這裏的action僅僅只是將元素打印到控制檯。orm
ArrayList<Integer> numberList = new ArrayList<>(Arrays.asList(1,2,3,4,5));
Consumer<Integer> action = System.out::println;
numberList.forEach(action);
複製代碼
程序輸出:get
1
2
3
4
5
複製代碼
咱們也能夠在map keys和values上迭代以及在全部元素上執行任何動做。string
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
//1. Map entries
Consumer<Map.Entry<String, Integer>> action = System.out::println;
map.entrySet().forEach(action);
//2. Map keys
Consumer<String> actionOnKeys = System.out::println;
map.keySet().forEach(actionOnKeys);
//3. Map values
Consumer<Integer> actionOnValues = System.out::println;
map.values().forEach(actionOnValues);
複製代碼
程序輸出:
A=1
B=2
C=3
A
B
C
1
2
3
複製代碼
咱們也能建立自定義的action方法來執行爲每一個collection中的元素自定義的邏輯。
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
Consumer<Map.Entry<String, Integer>> action = entry ->
{
System.out.println("Key is : " + entry.getKey());
System.out.println("Value is : " + entry.getValue());
};
map.entrySet().forEach(action);
複製代碼
程序輸出:
Key is : A
Value is : 1
Key is : B
Value is : 2
Key is : C
Value is : 3
複製代碼