[Java 8 Tutorial翻譯系列]Java forEach詳解

陳續淵發表於2019-05-14

Java forEach是一個對collection或者stream迭代以及對其中的每個元素執行某個動作的實用方法。

1. Java 8 forEach 方法

下面的程式碼片段展示了在Iterable interface中java forEach方法的預設實現。這樣可以使除了Map類之外的所有collection類使用它。

該方法將會對每個迭代元素執行給定的動作,直到所有元素被處理完畢或者動作丟擲了一個異常。

action代表一個接受單個輸入引數並且不返回任何值的操作。它是Consumer interface的一個例項。

// Iterable.java
default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}
複製程式碼

一個定製的action可以用如下的簡單語法生成。在這裡Object型別將會被collection或者stream裡的元素型別替代。

Consumer<Object> action = new Consumer<Object>()
{
    @Override
    public void accept(Object t)
    {
        //perform action
    }
};
複製程式碼

2. Java 8 stream forEach示例

在這個例子當中,我們將列印所有偶數。

// 在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 );
複製程式碼

程式輸出:

2
4
複製程式碼

3. Java 8 forEach 使用List示例

這裡的action僅僅只是將元素列印到控制檯。

ArrayList<Integer> numberList = new ArrayList<>(Arrays.asList(1,2,3,4,5));
     
Consumer<Integer> action = System.out::println;
 
numberList.forEach(action);
複製程式碼

程式輸出:

1
2
3
4
5
複製程式碼

4. Java 8 forEach 使用Map示例

我們也可以在map keys和values上迭代以及在所有元素上執行任何動作。

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
複製程式碼

5. 建立自定義的action

我們也能建立自定義的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
複製程式碼

相關文章