12/08/2018, 14:42

Tổng quan về stream API trong java 8

Stream API là một trong những feature chính của java 8 khi nó được giới thiệu, toàn bộ nằm trong package java.util.stream , gồm những API xử lý tuần tự các element cho collection. Dưới đây mình sẽ trình bày một vài ví dụ để demo cho việc làm thế nào để làm việc với Java 8 streams và làm thế nào ...

Stream API là một trong những feature chính của java 8 khi nó được giới thiệu, toàn bộ nằm trong package java.util.stream , gồm những API xử lý tuần tự các element cho collection. Dưới đây mình sẽ trình bày một vài ví dụ để demo cho việc làm thế nào để làm việc với Java 8 streams và làm thế nào để sử dụng các loại operation khác nhau của nó.

A stream đại diện cho một collection được xử lý tuần tự và hỗ trợ rất nhiều loại operation để tính toán dựa trên những element của collection đó, ví dụ đơn giản:

List<String> myList =
    Arrays.asList("a", "aa", "bb", "b", "c");

myList
    .stream()
    .filter(s -> s.startsWith("b"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

// BB
// B

Một stream operation có thể ở giữa hoặc ở cuối. Nếu nó là operation ở giữa, nó sẽ return một stream, nhờ vậy mà ta có thể thực hiện tính toán trên nhiều element ngay trong lúc này mà không cần bất cứ một dấu chấm phẩy nào. Một operation cuối nghĩa là nó ko return một stream nữa hoặc thậm chí là void. Ví dụ ở trên thì filter() map() sorted chính là operation giữa, còn forEach() là một operation cuối. Hầu hết các operation của stream đều có thể dùng lamba expression nên bạn có thể yên tâm sử dụng nhé.

Stream có thể được tạo từ nhiều nguồn khác nhau, nhưng hầu hết là collection, List và Set collection hỗ trợ 2 method để khởi tạo stream tuần tự là stream() và stream song song là parallelStream(). Một vài ví dụ về stream tuần tự như sau:

Arrays.asList("a", "aa", "aaa")
    .stream()
    .findFirst()
    .ifPresent(System.out::println);  // a

Nhưng nếu bạn muốn làm việc mới stream mà không cần tạo ra collection, có thể chọn cách sau:

Stream.of("a", "aa", "aaa")
    .findFirst()
    .ifPresent(System.out::println);  // a

Lưu ý: chỉ dùng Stream.of khi muốn tạo stream từ nguồn dữ liệu tham chiếu. Vậy giờ nếu mình muốn dùng stream với kiểu primitive thì sẽ như thế nào? Bạn có thể yên tâm vì stream đã support nhé:

IntStream.range(3, 7)
    .forEach(System.out::println);

// 3
// 4
// 5
// 6

Tương tự với LongStream hay DoubleStream nhé             </div>
            
            <div class=

0