Giả sử chúng ta có một ArrayList Student, có name và address gồm các thuộc tính city, district, number.
Ví dụ: Liệt kê tất cả các địa chỉ của toàn bộ sinh viên
// File Address.java
public class Address {
private String city;
private String district;
private int number;
public Address(String city, String district, int number) {
this.city = city;
this.district = district;
this.number = number;
}
@Override
public String toString() {
return "Address{" +
"city='" + city + '\'' +
", district='" + district + '\'' +
", number=" + number +
'}';
}
}
// File Student.java
public class Student {
private String name;
private Address address;
public Student(String name, Address address) {
this.name = name;
this.address = address;
}
public Address getAddress() {
return address;
}
public String getName() {
return name;
}
}
// File Main.java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Student> arr = new ArrayList<>();
arr.add(new Student("A", new Address("HCM", "Q5", 282)));
arr.add(new Student("B", new Address("HCM", "Q7", 110)));
arr.add(new Student("F", new Address("HCM", "Q8", 328)));
arr.add(new Student("D", new Address("HCM", "Q4", 443)));
arr.add(new Student("A", new Address("HCM", "Q5", 560)));
List<Address> addresses = arr.stream().map(t -> t.getAddress()).collect(Collectors.toList());
addresses.forEach(address -> System.out.println(address.toString()));
}
}
Output:
Address{city=’HCM’, district=’Q5′, number=282}
Address{city=’HCM’, district=’Q7′, number=110}
Address{city=’HCM’, district=’Q8′, number=328}
Address{city=’HCM’, district=’Q4′, number=443}
Address{city=’HCM’, district=’Q5′, number=560}
Ví dụ 2: Liệt kê tên của toàn bộ học sinh
// File Main.java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Student> arr = new ArrayList<>();
arr.add(new Student("A", new Address("HCM", "Q5", 282)));
arr.add(new Student("B", new Address("HCM", "Q7", 110)));
arr.add(new Student("F", new Address("HCM", "Q8", 328)));
arr.add(new Student("D", new Address("HCM", "Q4", 443)));
arr.add(new Student("A", new Address("HCM", "Q5", 560)));
List<String> names = arr.stream().map(t -> t.getName()).collect(Collectors.toList());
names.forEach(name -> System.out.println(name));
}
}
Output:
A
B
F
D
A
Map object null
// File Main.java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Student> arr = new ArrayList<>();
arr.add(new Student("A", null));
arr.add(new Student("B", new Address("HCM", "Q5", 282)));
List<Address> addresses = arr.stream().map(t -> t.getAddress()).collect(Collectors.toList());
addresses.forEach(address -> System.out.println(address.toString()));
}
}
Với đoạn code trên mình sẽ bị NullPointerException, vì address của Student A có address null. Để tránh vấn đề trên, chúng ta sử dụng Map kết hợp với filter để lọc đi những phần tử null trước.
// File Main.java
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Student> arr = new ArrayList<>();
arr.add(new Student("A", null));
arr.add(new Student("B", new Address("HCM", "Q5", 282)));
List<Address> addresses = arr.stream()
.filter(t -> t.getAddress() != null)
.map(t -> t.getAddress()).collect(Collectors.toList());
addresses.forEach(address -> System.out.println(address.toString()));
}
}
Output: Address{city=’HCM’, district=’Q5′, number=282}