การบันทึกบรรทัดของโค้ดอาจถูกมองว่าเป็นคุณลักษณะใหม่หากช่วยให้คุณสามารถเขียนตรรกะจำนวนมากในลักษณะที่สั้นและชัดเจนขึ้นซึ่งจะใช้เวลาน้อยลงสำหรับผู้อื่นในการอ่านและทำความเข้าใจ
หากไม่มีStream
ไปป์ไลน์นิพจน์แลมบ์ดา (และ / หรือการอ้างอิงวิธีการ) จะอ่านได้น้อยกว่ามาก
ลองนึกดูว่าStream
ไปป์ไลน์ต่อไปนี้จะเป็นอย่างไรหากคุณแทนที่นิพจน์แลมบ์ดาแต่ละนิพจน์ด้วยอินสแตนซ์คลาสที่ไม่ระบุตัวตน
List<String> names =
people.stream()
.filter(p -> p.getAge() > 21)
.map(p -> p.getName())
.sorted((n1,n2) -> n1.compareToIgnoreCase(n2))
.collect(Collectors.toList());
มันจะเป็น:
List<String> names =
people.stream()
.filter(new Predicate<Person>() {
@Override
public boolean test(Person p) {
return p.getAge() > 21;
}
})
.map(new Function<Person,String>() {
@Override
public String apply(Person p) {
return p.getName();
}
})
.sorted(new Comparator<String>() {
@Override
public int compare(String n1, String n2) {
return n1.compareToIgnoreCase(n2);
}
})
.collect(Collectors.toList());
การเขียนนี้ยากกว่าเวอร์ชันที่มีนิพจน์แลมบ์ดามากและมีโอกาสเกิดข้อผิดพลาดได้ง่ายกว่ามาก ยังเข้าใจยากกว่า
และนี่คือท่อส่งที่ค่อนข้างสั้น
เพื่อให้สามารถอ่านได้โดยไม่ต้องใช้นิพจน์แลมบ์ดาและการอ้างอิงเมธอดคุณจะต้องกำหนดตัวแปรที่เก็บอินสแตนซ์อินเทอร์เฟซการทำงานต่างๆที่ใช้ที่นี่ซึ่งจะแยกตรรกะของไปป์ไลน์ทำให้เข้าใจยากขึ้น
(o1, o2) -> o1.getName().compareTo(o2.getName())