Thắc mắc stream trong java

Mình đang học java thì bắt gặp thằng stream API từ java 8 trở lên, mình thấy nó có rất nhiều chức năng lọc , tìm …, vậy thì cái stream (luồng ) này để làm gì, trong tình huống nào, 1 chương trình gồm nhiều process, mỗi process lại gồm các luồng , mọi thứ tự nhiên , tự nhiên có cái luồng này làm gì vậy mọi người (trả lời giúp m 3 câu hỏi trên với)

Bạn có thể đọc bài này


Stream bản chất là cách xử lý các CTDL dạng Collection dùng lambda expression, function programing
Đây là một cách viết mới rút gọn hơn việc duyệt mảng, set xong thao tác. Với Stream bạn có thể xử lý chỉ cần 1 dòng code
VD

Arrays.asList(1, 2, 3, 4, 5).stream().forEach(System.out::print); // 12345

So với

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
for(Integer i : list) {
    System.out.print(i);
}
// 12345
2 Likes

Bạn xem link này: https://gpcoder.com/3923-gioi-thieu-ve-stream-api-trong-java-8/

mấy cái này mình cũng đọc rồi nhưng cái khái niệm về luồng nó mang thiên hướng đi vào phần cứng quá, giả xử mình có chương trình gồm cách mảng các số, mình muốn đếm các số lẻ thì thay vì dùng for thì dùng luồng , vậy cái luồng này là gì (1 vòng lặp == 1 luồng ??) mong các bạn giải thích rõ chứ đừng dùng cái luồng là đơn vị nhỏ nhất của chương trình hay luồng là đơn vị của process @@

Stream khác thread
Một bài khác nói rõ về Stream hơn https://huongdanjava.com/vi/gioi-thieu-ve-stream-trong-java.html
Ý tưởng của stream là biến Collection hay Set thành một luồng dữ liệu để xử lý tuần tự từng phần tử một hoặc song song. Thay vì cách cũ là duyệt phần tử
Bản thân Stream không lưu trữ phần tử, nó chỉ là một wrapper class để giúp bạn sử dụng lambda expression trong việc xử lý dữ liệu Collection
Class stream chứa rất nhiều các operator khác nhau để xử lý như filter, map, district, min, max, forEach,… Giúp bạn có thể xử lý dữ liệu đơn giản, dễ hiểu hơn
Còn thread là luồng chương trinh, không liên quan đến Stream

Quá trình Stream sẽ thế này

Dữ liệu -> stream -> cấu hình -> xử lý dữ liệu -> trả về kết quả

VD rõ hơn về Stream

Human h1 = new Human("Hai", Sex.MALE, 21);
Human h2 = new Human("Loan", Sex.FEMALE, 22);
Human h3 = new Human("Ha", Sex.FEMALE, 18);
Human h4 = new Human("Quang", Sex.MALE, 20);
Human h5 = new Human("Tung", Sex.MALE, 26);

List<Human> people = Arrays.asList(h1, h2, h3, h4, h5);

// In ra tên của những người có tên bắt đầu bằng chữ H
people.stream().filter(human -> human.getName().startsWith("H")).forEach(human -> System.out.println(human.getName())); // Hai Ha

// Tách lấy tên trong list people sang list mới là listOfName
List<String> listOfName = people.stream().map(Human::getName).collect(Collectors.toList()); // ["Hai", "Loan", "Ha", "Quang", "Tung"]

// Tìm người nhỏ tuổi nhất trong list
Human youngest = people.stream().min(Comparator.comparing(Human::getAge)).get();
System.out.println(youngest.getAge()); // 18

Full example: http://txt.do/dvrn5
Run example bằng cách replace full code vào https://code.sololearn.com/cVRUy2BwauK8#java

2 Likes

cái chữ luồng dữ liệu ấy bạn, mình cần hiểu rõ 1 chút là giả sử dữ liệu là 1 bể nước thì cái luồng này sẽ làm gì với bể nước ấy, thay vì dùng loop là xem xét qua từng giọt nước thì luồng sẽ làm như thế nào ấy, và tại sao ko thể dùng lại đc

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?