Vui lòng đi qua bài viết đầy đủ để có được một ý tưởng rõ ràng,
bản đồ so với bản đồ phẳng:
Để trả về độ dài của mỗi từ trong danh sách, chúng tôi sẽ làm một cái gì đó như dưới đây ..
Phiên bản ngắn được đưa ra dưới đây
Khi chúng tôi thu thập hai danh sách, được đưa ra dưới đây
Không có bản đồ phẳng => [1,2], [1,1] => [[1,2], [1,1]] Ở đây hai danh sách được đặt trong danh sách, do đó, đầu ra sẽ là danh sách chứa danh sách
Với bản đồ phẳng => [1,2], [1,1] => [1,2,1,1] Ở đây hai danh sách được làm phẳng và chỉ các giá trị được đặt trong danh sách, do đó, đầu ra sẽ là danh sách chỉ chứa các phần tử
Về cơ bản, nó hợp nhất tất cả các đối tượng thành một
## Phiên bản chi tiết đã được đưa ra dưới đây: -
Ví dụ: -
Xem xét một danh sách [ “STACK”, “OOOVVVER”] và chúng tôi đang cố gắng để trả về một danh sách như thế [ ‘STACKOVER’] (trở về chữ chỉ độc đáo từ danh sách đó) Ban đầu, chúng tôi sẽ làm một cái gì đó giống như bên cạnh để quay một danh sách [ “STACKOVER”] từ [ “STACK”, “OOOVVVER”]
public class WordMap {
public static void main(String[] args) {
List<String> lst = Arrays.asList("STACK","OOOVER");
lst.stream().map(w->w.split("")).distinct().collect(Collectors.toList());
}
}
Vấn đề là ở chỗ, Lambda chuyển đến phương thức bản đồ trả về một mảng Chuỗi cho mỗi từ, do đó, luồng được trả về bởi phương thức bản đồ thực sự là kiểu Stream, nhưng cái chúng ta cần là Stream để biểu diễn một luồng ký tự, bên dưới hình ảnh minh họa vấn đề.
Hình A:
Bạn có thể nghĩ rằng, Chúng tôi có thể giải quyết vấn đề này bằng cách sử dụng sơ đồ phẳng,
OK, hãy cho chúng tôi xem cách giải quyết vấn đề này bằng cách sử dụng bản đồ và Arrays.flow
Trước hết, bạn sẽ cần một luồng ký tự thay vì một mảng các mảng. Có một phương thức gọi là Arrays.stream () sẽ lấy một mảng và tạo ra một luồng, ví dụ:
String[] arrayOfWords = {"STACK", "OOOVVVER"};
Stream<String> streamOfWords = Arrays.stream(arrayOfWords);
streamOfWords.map(s->s.split("")) //Converting word in to array of letters
.map(Arrays::stream).distinct() //Make array in to separate stream
.collect(Collectors.toList());
Ở trên vẫn không hoạt động, vì bây giờ chúng tôi kết thúc với một danh sách các luồng (chính xác hơn là Luồng>), thay vào đó, trước tiên chúng tôi phải chuyển đổi từng từ thành một mảng các chữ cái riêng lẻ và sau đó tạo từng mảng thành một luồng riêng biệt
Bằng cách sử dụng FlatMap, chúng tôi sẽ có thể khắc phục vấn đề này như dưới đây:
String[] arrayOfWords = {"STACK", "OOOVVVER"};
Stream<String> streamOfWords = Arrays.stream(arrayOfWords);
streamOfWords.map(s->s.split("")) //Converting word in to array of letters
.flatMap(Arrays::stream).distinct() //flattens each generated stream in to a single stream
.collect(Collectors.toList());
FlatMap sẽ thực hiện ánh xạ từng mảng không phải với luồng mà với nội dung của luồng đó. Tất cả các luồng riêng lẻ sẽ được tạo trong khi sử dụng bản đồ (Arrays :: stream) được hợp nhất thành một luồng duy nhất. Hình B minh họa hiệu quả của việc sử dụng phương thức FlatMap. So sánh nó với những gì bản đồ làm trong hình A.
Hình B
Phương thức FlatMap cho phép bạn thay thế từng giá trị của một luồng bằng một luồng khác và sau đó nối tất cả các luồng được tạo thành một luồng duy nhất.
map :: Stream T -> (T -> R) -> Stream R
,flatMap :: Stream T -> (T -> Stream R) -> Stream R
.