博客 / 詳情

返回

02 遍歷 foreach

遍歷 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 );
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.