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
复制代码