Given the definition of the Country class:



public class Country {

    public enum Continent {
        ASIA, EUROPE
    }
    String name;
    Continent region;

    public Country(String na, Continent reg) {
        name = na;
        region = reg;
    }

    public String getName() {
        return name;
    }

    public Continent getRegion() {
        return region;
    }
}

and the code fragment:

List<Country> couList = Arrays.asList(
        new Country("Japan", Country.Continent.ASIA),
        new Country("Italy", Country.Continent.EUROPE), new Country("Germany", Country.Continent.EUROPE));
Map<Country.Continent, List<String>> regionNames = couList.stream().
        collect(Collectors.groupingBy(Country::getRegion,
                Collectors.mapping(Country::getName, Collectors.toList())));
System.out.println(regionNames);

What is the output?

A.

{EUROPE = [Italy, Germany], ASIA = [Japan]}

B.

{ASIA = [Japan], EUROPE = [Italy, Germany]}

C.

{EUROPE = [Germany, Italy], ASIA = [Japan]}

D.

{EUROPE = [Germany], EUROPE = [Italy], ASIA = [Japan]}

題解

程式第43行,取得couList清單物件的串流物件。

程式第44和45行,串流物件的collect方法可以將串流物件再轉成別的Collection物件,配合Collectors類別的groupingBy方法可以將串流物件中的元素群組化,轉成Map物件。群組化的依據為串流物件的Country物件元素之呼叫getRegion方法後的回傳內容,這個會作為Map的Key值。至於Map的Key值所對應的元素,在這裡使用了Collectors類別的mapping方法,將串流物件的Country物件元素之呼叫getName方法後的回傳內容轉成List物件。

因此最後產生的Map集合物件,「ASIA」這個地區下只有「Japan」,而「EUROPE」這個地區下有「Italy」和「Germany」。至於元素在Map物件中的順序,愈先建立群組的項目會排在愈後面,所以「ASIA」會排在「EUROPE」之後。元素在List物件中的順序就是原先集合物件的走訪順序,所以「Italy」在「Germany」之前。