遍历 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 );
03-05 15:01