1. Chuyển đổi dữ liệu

Lớp này Stream<T>cũng có một phương thức cho phép bạn chuyển đổi dữ liệu từ kiểu này sang kiểu khác. Phương pháp này là map().

Nó cũng trả về một luồng, nhưng với các phần tử thuộc loại khác. Phương map()thức nhận làm đối số phương thức, một hàm chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác.

Ví dụ:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
Chuyển đổi một Integerluồng thành một Stringluồng

Đối số hàm được truyền cho map()phương thức nhận một số xvà trả về biểu diễn chuỗi của nó. Nhân tiện, bạn có thể viết mã này gọn hơn:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Chuyển đổi một Integerluồng thành một Stringluồng

Chuyển đổi một chuỗi thành một số

Tương tự, bạn có thể viết mã để chuyển đổi một chuỗi thành một số — điều này cũng không phức tạp:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
Chuyển đổi một Stringluồng thành một Integerluồng

Chuyển đổi một chuỗi thành mộtURI

Các hoạt động chuyển đổi dữ liệu có thể tốn nhiều tài nguyên và thời gian. Giả sử chúng ta muốn chuyển đổi một tập hợp các chuỗi thành các đối tượng URI. Điều này rất dễ thực hiện, bởi vì hàm tạo URI lấy một chuỗi làm đối số.

ArrayList<String> list = new ArrayList<String>();
list.add("https://google.com");
list.add("https://linkedin.com");
list.add("https://yandex.com");

Stream<URI> stream = list.stream().map( URI::new );
Chuyển đổi Stringluồng thành URIluồng

Chúng tôi đã tạo một bộ sưu tập và điền vào đó 3 địa chỉ web. Sau đó, chúng tôi có một Stream<String>đối tượng từ bộ sưu tập và lần lượt từ luồng đó, chúng tôi có một Stream<URI>đối tượng. Chúng tôi đã chuyển phương thức bản đồ một tham chiếu đến phương thức sẽ được sử dụng để chuyển đổi từng Chuỗi thành URI.

Phương thức này (hàm tạo) phải lấy a Stringlàm đối số. Mọi thứ dường như trở nên hoàn hảo...


2. Ngoại lệ

Chúng tôi có thể mong đợi rằng đoạn mã trên sẽ hoạt động, nhưng nó sẽ không hoạt động — chương trình sẽ không biên dịch. Và không phải vì chúng tôi đã phạm sai lầm ở đâu đó, mà bởi vì những người tạo ra Java đã nhầm lẫn.

Ngày xửa ngày xưa, họ đã có một ý tưởng tuyệt vời là thêm một ngoại lệ được kiểm tra ( URISyntaxException) vào URIhàm tạo của lớp! Và các ngoại lệ như vậy phải được gói trong tệp try-catch.

Vì vậy, dòng cuối cùng của mã của chúng tôi sẽ trông như thế này:

Stream<URI> stream = list.stream().map(str ->
{
  try
  {
     return new URI(str);
  }
  catch (URISyntaxException e)
  {
     e.printStackTrace();
     return null;
  }
});

Chúng ta có thể nói gì? Bạn nên suy nghĩ kỹ trước khi sử dụng một ngoại lệ được kiểm tra . Và suy nghĩ ba lần trước khi sử dụng chúng trong hàm tạo.