遍历 foreach
Java 8的foreach() 方法 是一种有效的方式,用来遍历书架集合,可以对List,Stream 进行遍历,该方法已经被添加到以下接口中
- Iterable 接口-
- Map 接口
- Stream 接口
1. Iterable foreach
1.1 foreach 方法
下面的代码中给定了Iterable 接口中foreach 方法的默认实现
default void forEach(Consumer<? super T> action)
{
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
该foreach 方法action 对每个元素执行给定,Iterable 直到所有的元素都处理或 action 引发异常
实例1,使用 foreach 遍历list 的java 程序
List<String> names = Arrays.asList("Alex", "Brian", "Charles");
names.forEach(System.out::println);
输出:
Alex
Brian
Charles
1.2 创建消费者行为--- consumer
在上面的实例中,action 表示接受单个输入参数并且不返回任何数据, 它是Consumer 接口的实例,通过这样的创建消费者操作. 我们制定要以类似方法的语法 执行多个语句
public static void main(String[] args) {
List<String> names = Arrays.asList("Alex", "Brian", "Charles");
// 创建一个消费之操作
Consumer<String> makeUpperCase = new Consumer<String>() {
@Override
public void accept(String o) {
System.out.println(o.toUpperCase());
}
};
names.forEach(makeUpperCase);
}
// 结果
ALEX
BRIAN
CHARLES
使用匿名函数内部类的方式,现在可以使用 lanmbda 表达式代替
Consumer<String> makeUpperCase = o -> System.out.println(o.toUpperCase());
2 Map 中 foreach
2.1 foreach 方法
该方法执行给定的BiConsumer action 来执行map 中entry,知道所有的是数据被处理完,或者抛出异常
map 中的默认方法
default void forEach(BiConsumer<? super K, ? super V> action) {
Objects.requireNonNull(action);
for (Map.Entry<K, V> entry : entrySet()) {
K k;
V v;
try {
k = entry.getKey();
v = entry.getValue();
} catch(IllegalStateException ise) {
// this usually means the entry is no longer in the map.
throw new ConcurrentModificationException(ise);
}
action.accept(k, v);
}
}
实例2 ,通过foreach 方法来遍历map
Map<String, String> map = new HashMap<String, String>();
map.put("A", "Alex");
map.put("B", "Brian");
map.put("C", "Charles");
BiConsumer<String, String> biConsumer = new BiConsumer<String,String>() {
@Override
public void accept(String key, String value) {
System.out.println(key+" "+value);
}
};
map.forEach(biConsumer);
}
// 使用lambda 表达式 替换 匿名函数
BiConsumer<String, String> biConsumer = (key, value) -> System.out.println(key+" "+value);
打印结果
A Alex
B Brian
C Charles
3. Stream foreach 和 forEachOrdered
在Stream中 foreach 和 foreEachOrdered 都是终端操作,Stream 的 foreach 方法 对map 中的每一个元素执行一个action 方法,对于顺序流,元素的顺序流 与源流中的顺序是保持一直的,使用并行流的时候,foreachOrdered方法很有效,尽量使用这个方法,foreach 无法保证在并行流中元素的顺序
例子3 遍历Stream 中 foreach
List<Integer> numberList = Arrays.asList(1,2,3,4,5); Consumer<Integer> action = System.out::println; numberList.stream() .filter(n -> n%2 == 0) .forEach( action );输出: 2 4
例子 4 使用 foreachOrdered 遍历stream
List<Integer> numberList = Arrays.asList(1,2,3,4,5); Consumer<Integer> action = System.out::println; numberList.stream() .filter(n -> n%2 == 0) .parallel() .forEachOrdered( action );