Xem lại ví dụ ở phần 2.10: lấy ra tất cả các ngôn ngữ được sủ dụng ở Thuỵ Sĩ: Map countryLanguageSets = locales.collect( Collectors.toMap( l > l.getDisplayCountry(), l > Collections.singleton(l.getDisplayLanguage()), (a, b) > { Union of a and b Set r = new HashSet(a); r.addAll(b); return r; })); >Chúng ta phải tạo ra thiết lập đơn cho mỗi ngôn ngữ được tìm thấy. Sau đó ta kết hợp những ngôn ngữ đã có với ngôn ngữ mới được tìm thấy Đây là một cách dài dòng. Có cách khác trực tiếp hơn: dùng phương thức groupingBy Stream locales = Stream.of(Locale.getAvailableLocales()); Map countryToLocales = locales.collect( Collectors.groupingBy(Locale::getCountry)); List swissLocales = countryToLocales.get(CH); System.out.println(CH locales: + swissLocales); Kết quả:swissLocales: fr_CH, de_CH, it_CH Locale::getCountry là hàm phân loại của grouping. Chú ý: mỗi locale đều có 1 mã ngôn ngữ và mã quốc gia ví dụ: en_US là English ở Mĩ.
BÁO CÁO LẬP TRÌNH JAVA Họ và tên: Giáp Văn Quyết MSSV: 20122304 Giáo viên hướng dẫn: TS.Nguyễn Hồng Quang Nội dung báo cáo A. Grouping and Partitioning B. Câu hỏi A. Grouping and partitioning Xem lại ví dụ ở phần 2.10: lấy ra tất cả các ngôn ngữ được sủ dụng ở Thuỵ Sĩ: Map countryLanguageSets = locales.collect( Collectors.toMap( l -> l.getDisplayCountry(), l -> Collections.singleton(l.getDisplayLanguage()), (a, b) -> { // Union of a and b Set r = new HashSet(a); r.addAll(b); return r; })); ->Chúng ta phải tạo ra thiết lập đơn cho mỗi ngôn ngữ được tìm thấy. Sau đó ta kết hợp những ngôn ngữ đã có với ngôn ngữ mới được tìm thấy A. Grouping and partitioning ⇒ Đây là một cách dài dòng. Có cách khác trực tiếp hơn: dùng phương thức groupingBy Stream locales = Stream.of(Locale.getAvailableLocales()); Map countryToLocales = locales.collect( Collectors.groupingBy(Locale::getCountry)); List swissLocales = countryToLocales.get("CH"); System.out.println("CH locales: " + swissLocales); Kết quả:swissLocales: [fr_CH, de_CH, it_CH] Locale::getCountry là hàm phân loại của grouping. Chú ý: mỗi locale đều có 1 mã ngôn ngữ và mã quốc gia ví dụ: en_US là English ở Mĩ. A. Grouping and partitioning Khi hàm phân loại là 1 hàm predicate, các yếu tố Stream được chia làm 2 danh sách, 1 là true, 2 là false. Khi đó dùng partitioningBy hiệu quả hơn groupingBy. Ví dụ: Stream locales = Stream.of(Locale.getAvailableLocales()); Map englishAndOtherLocales = locales.collect( Collectors.partitioningBy(l -> l.getLanguage().equals("en"))); System.out.println("English locales: " + englishAndOtherLocales.get(true)); Kết quả: English locales: [en_US, en_SG, en_MT, en, en_PH, en_NZ, en_ZA, en_AU, en_IE, en_CA, en_IN, en_GB] A. Grouping and partitioning Phương thức groupingBy cho ra một map có giá trị là các list. Nếu bạn muốn dùng set thay vì list có thể sử dụng Collector.toSet. Ví dụ: Stream locales = Stream.of(Locale.getAvailableLocales()); Map countryToLocaleSet = locales.collect( Collectors.groupingBy(Locale::getCountry, Collectors.toSet())); System.out.println("countryToLocaleSet: " + countryToLocaleSet); A. Grouping and partitioning Lớp Collectors còn cung cấp một số phương thức về việc nhóm như: counting, summing, minBy, maxBy, mapping, reducing. A. Grouping and partitioning 1. counting: đếm lại số phần tử được nhóm. Ví dụ Đếm xem có bao nhiêu locale trong quốc gia. Stream locales = Stream.of(Locale.getAvailableLocales()); Map countryToLocalCounts = locales.collect(Collectors.groupingBy(Locale::getCountry, Collectors.counting())); System.out.println(countryToLocalCounts); A. Grouping and partitioning 2. summing(Int|Long|Double) :nhận vào các đối số, áp dụng các hàm vào các phần tử, và đưa ra tổng của chúng, ví dụ tính tổng dân số trong 1 bang của thành phố: Map stateToCityPopulation = cities.collect(Collectors.groupingBy(City::getState, Collectors.summingInt(City::getPopulation))); A. Grouping and partitioning 3.minBy, maxBy: lấy 1 bộ so sánh và sinh ra giá trị lớn nhất nhỏ nhất của các phần tử trong stream. Ví dụ: Map stateToLargestCity = cities.collect(Collectors.groupingBy(City::getState, Collectors.maxBy(Comparator.comparing(City::getPopulation)))); Đưa ra thành phố có số dân lớn nhất trong bang. A. Grouping and partitioning 4.mapping: áp dụng một hàm cho kết quả nhóm, và nó yêu cầu một bộ tập hợp khác khác để xử lý kết quả của nó. Ví dụ: Map stateToLongestCityName = cities.collect(Collectors.groupingBy(City::getState, Collectors.mapping(City::getName, Collectors.maxBy(Comparator.comparing(String::length))))); Ở đây, chúng ta nhóm thành phố theo bang. Trong mỗi bang, chúng ta sinh ra tên của các thành phố và lấy tên có độ dài lớn nhất. A. Grouping and partitioning Nếu việc hàm grouping và mapping có kiểu trả về là int, long, hay double, bạn có thể tập hợp kết quả thành đối tượng summary statistics. Ví dụ: Map stateToCityPopulationSummary = cities.collect( Collectors.groupingBy(City::getState, Collectors.summarizingInt(City::getPopulation))); từ đó bạn có thể tính tổng, đếm, giá trị trung bình, giá trị nhỏ nhất, lớn nhất của các hàm giá trị từ đối tượng summary statistics của mỗi nhóm. A. Grouping and partitioning 5. reducing: Các phương thức áp dụng một hoạt đông rút gon cho các phần tử trong stream, 3 hình thức: reducing(binaryOperator), reducing(identity, binaryOperator) và reducing(identity, mapper, binaryOperator): Ở hình thức đầu tiên, phần tử định danh là null. Ở hình thức thứ ba, hàm mapping được áp dụng và giá trị của nó được rút gọn. Đây là ví dụ lấy một xâu tên thành phố được tách ra bằng dấu phẩy ở mỗi bang. Map stateToCityNames = cities.collect( groupingBy(City::getState, reducing("", City::getName, (s, t) -> s.length() == 0 ? t : s + ", " + t))); A. Grouping and partitioning Collectors.reduce hiếm khi sử dụng đến. Trong tình huống này, bạn có thể đạt được cùng kết quả theo cách tự nhiên hơn: Map stateToCityNames = cities.collect( groupingBy(City::getState, mapping(City::getName, joining(", ")))); A. Grouping and partitioning Kết luận: Các phương thức của Collectors ở trên có thể tạo ra các biểu thức rất phức tạp. Bạn nên chỉ sử dụng chúng với groupingBy và partitioningBy đễ xử lý các giá trị được nhóm. Nếu không thì đơn giản gọi các phương thức chẳng hạn map, reduce, count, max, hay min trực tiếp trên streams. B. Câu hỏi Câu 1: Phương thức minBy và maxBy trong lớp Collector được sử dụng để làm gì? A. Lấy một bộ so sánh và sắp xếp theo giá trị lớn nhất, nhỏ nhất của các phần tử trong stream B. Lấy một bộ so sánh và sắp xếp theo giá trị nhỏ nhất, lớn nhất của các phần tử trong stream C. Lấy một bộ so sánh và đưa ra giá trị lớn nhất, nhỏ nhất của các phần tử trong stream D. Lấy một bộ so sánh và đưa ra giá trị nhỏ nhất, lớn nhất của các phần tử trong stream Đáp án D B. Câu hỏi Câu 2: Phương thức reducing trong lớp Collector có bao nhiêu hình thức? A. B. C. D. 1 2 3 4 Đáp án C B. Câu hỏi Câu 3: Vì sao nên sử dụng partitioningBy thay cho groupingBy khi hàm phân loại là 1 hàm predicate? A. Vì groupingBy không thể sử dụng khi hàm phân loại là hàm predicate. B. Vì partitioningBy thì dễ sử dụng hơn so với groupingBy khi hàm phân loại là predicate. C. Vì partitioningBy thì hiệu quả hơn groupingBy khi hàm phân loại là predicate. D. Cả B và C. Đáp án C [...]... cities.collect( groupingBy(City::getState, reducing("", City::getName, (s, t) -> s.length() == 0 ? t : s + ", " + t))); A Grouping and partitioning Collectors.reduce hiếm khi sử dụng đến Trong tình huống này, bạn có thể đạt được cùng kết quả theo cách tự nhiên hơn: Map stateToCityNames = cities.collect( groupingBy(City::getState, mapping(City::getName, joining(", ")))); A Grouping and partitioning. .. thức? A B C D 1 2 3 4 Đáp án C B Câu hỏi Câu 3: Vì sao nên sử dụng partitioningBy thay cho groupingBy khi hàm phân loại là 1 hàm predicate? A Vì groupingBy không thể sử dụng khi hàm phân loại là hàm predicate B Vì partitioningBy thì dễ sử dụng hơn so với groupingBy khi hàm phân loại là predicate C Vì partitioningBy thì hiệu quả hơn groupingBy khi hàm phân loại là predicate D Cả B và C Đáp án C ... chúng ta sinh ra tên của các thành phố và lấy tên có độ dài lớn nhất A Grouping and partitioning Nếu việc hàm grouping và mapping có kiểu trả về là int, long, hay double, bạn có thể tập hợp kết quả thành đối tượng summary statistics Ví dụ: Map stateToCityPopulationSummary = cities.collect( Collectors.groupingBy(City::getState, Collectors.summarizingInt(City::getPopulation)));...A Grouping and partitioning 4.mapping: áp dụng một hàm cho kết quả nhóm, và nó yêu cầu một bộ tập hợp khác khác để xử lý kết quả của nó Ví dụ: Map stateToLongestCityName = cities.collect(Collectors.groupingBy(City::getState, Collectors.mapping(City::getName, Collectors.maxBy(Comparator.comparing(String::length)))));... Collectors.summarizingInt(City::getPopulation))); từ đó bạn có thể tính tổng, đếm, giá trị trung bình, giá trị nhỏ nhất, lớn nhất của các hàm giá trị từ đối tượng summary statistics của mỗi nhóm A Grouping and partitioning 5 reducing: Các phương thức áp dụng một hoạt đông rút gon cho các phần tử trong stream, 3 hình thức: reducing(binaryOperator), reducing(identity, binaryOperator) và reducing(identity,... groupingBy(City::getState, mapping(City::getName, joining(", ")))); A Grouping and partitioning Kết luận: Các phương thức của Collectors ở trên có thể tạo ra các biểu thức rất phức tạp Bạn nên chỉ sử dụng chúng với groupingBy và partitioningBy đễ xử lý các giá trị được nhóm Nếu không thì đơn giản gọi các phương thức chẳng hạn map, reduce, count, max, hay min trực tiếp trên streams B Câu hỏi Câu 1: Phương thức minBy và