Tải bản đầy đủ (.pptx) (18 trang)

Báo cáo lập trình java về Grouping and Partitioning

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (154.76 KB, 18 trang )

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ĩ:
MapCollectors.toMap(
l -> l.getDisplayCountry(),
l -> Collections.singleton(l.getDisplayLanguage()),
(a, b) -> { // Union of a and b
Set<String> 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<Locale> locales = Stream.of(Locale.getAvailableLocales());
Map countryToLocales = locales.collect(
Collectors.groupingBy(Locale::getCountry));
List<Locale> 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<Locale> 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<Locale> 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<Locale> locales = Stream.of(Locale.getAvailableLocales());
Map<String, Long> 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<String, Integer> 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ụ:
Mapcities.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ụ:
Mapcities.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<String, IntSummaryStatistics> 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<String, String> 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<String, String> 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



×