CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này, giải thích chi tiết về các ví dụ phát trực tuyến tính năng mới của Java 8, được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Luồng là gì?
Luồng là kênh dữ liệu được sử dụng để hoạt động theo chuỗi các phần tử được tạo bởi nguồn dữ liệu (bộ sưu tập, mảng, v.v.).
Ưu điểm của Stream: có thể khai báo, có thể kết hợp và có thể song song hóa. Ba tính năng này giúp hoạt động truyền phát đơn giản hơn, linh hoạt hơn và hiệu quả hơn.
Các hoạt động của luồng có hai đặc điểm: nhiều hoạt động có thể được xâu chuỗi để chạy và lặp lại nội bộ.
Luồng có thể được chia thành luồng song song và luồng nối tiếp. API luồng có thể chuyển đổi khai báo giữa luồng song song và luồng tuần tự thông qua song song () và tuần tự (). Không cần phải giải thích chi tiết về luồng nối tiếp. Luồng song song chủ yếu là để thích ứng với thời đại hiện tại của máy đa lõi và cải thiện việc sử dụng CPU và bộ nhớ của hệ thống là chia nội dung thành nhiều khối dữ liệu và. sử dụng các luồng khác nhau để xử lý chúng tương ứng. Luồng song song Java 1.8 sử dụng khung fork/join. Để biết thêm thông tin về khung fork/join, vui lòng tham khảo http://ifeve.com/talk-concurrency-forkjoin/ để tìm hiểu.
Để ý :
* 1. Luồng không tự lưu trữ dữ liệu.
* 2. Stream sẽ không thay đổi đối tượng ban đầu, chúng sẽ trả về một Stream mới.
* 3. Các hoạt động của luồng bị trì hoãn, chúng sẽ đợi cho đến khi các kết quả yêu cầu được thực thi.
* 4. Sử dụng các luồng song song không nhất thiết sẽ cải thiện hiệu quả vì jvm cũng cần có thời gian để cắt dữ liệu và chuyển luồng.
Bài viết này chủ yếu nói về ba bước hoạt động của Luồng: 1. Tạo Luồng 2. Hoạt động trung gian 3. Hoạt động chấm dứt.
Tạo luồng.
Tạo Luồng là chuyển đổi nguồn dữ liệu (chẳng hạn như bộ sưu tập, mảng) thành luồng.
1. Lấy luồng dữ liệu thông qua luồng() (nối tiếp) hoặc song songStream() (song song) do chuỗi Bộ sưu tập cung cấp.
2. Lấy luồng dữ liệu thông qua phương thức tĩnh stream() trong Arrays.
3. Lấy luồng dữ liệu thông qua phương thức tĩnh() trong lớp Stream.
?
1
2
3
4
5
6
7
8
9
|
Danh sách danh sách =
mới
Mảng List<>();
Luồng stream1 = danh sách.luồng();
Luồng stream2 = danh sách.parallelStream();
Người dùng[] u =
mới
Người dùng[
2
];
Luồng stream3 = Mảng.luồng(u);
Luồng luồng4 = Luồng.của(
"11"
,
"2"
);
|
Các thao tác trung gian.
Các thao tác trung gian là một chuỗi các thao tác trên nguồn dữ liệu. Nhiều thao tác trung gian có thể được kết nối để tạo một đường ống. Trừ khi trình kích hoạt trên đường ống chấm dứt hoạt động, các hoạt động trung gian sẽ không thực hiện bất kỳ quá trình xử lý nào. Thay vào đó, chúng sẽ được xử lý tất cả cùng một lúc khi hoạt động kết thúc, trở thành việc đánh giá lười biếng.
Rây và cắt lát.
1. bộ lọc (vị ngữ) -nhận lambda và loại trừ các phần tử nhất định khỏi luồng.
2. limit(n) - cắt bớt luồng sao cho các phần tử của nó không vượt quá số đã cho.
3. bỏ qua(n)-bỏ qua các phần tử và trả về một luồng loại bỏ n phần tử đầu tiên. Nếu có ít hơn n phần tử trong luồng thì luồng trống sẽ được trả về, bổ sung cho limit(n).
4. Lọc riêng biệt, loại bỏ các phần tử trùng lặp thông qua hashcode() và Equals() của các phần tử do luồng tạo ra.
?
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* In thông tin của 4 người dùng đầu tiên có độ tuổi lớn hơn 18 (không trùng lặp)
* và bỏ qua người dùng đầu tiên
*/
@Bài kiểm tra
công cộng
vô hiệu
test1(){
danh sách.luồng()
.bộ lọc((x)->x.getAge()>
18
)
.riêng biệt()
.giới hạn(
4
)
.nhảy(
1
).forEach(Hệ thống.out::println);
}
|
lập bản đồ.
1. Bản đồ, nhận Lambda, chuyển đổi các phần tử sang dạng khác hoặc trích xuất thông tin. Nhận một hàm làm đối số, hàm này sẽ được áp dụng cho từng phần tử và ánh xạ vào phần tử mới.
2. mapToDouble/mapToInt/mapToLong, nhận một hàm làm tham số, hàm này sẽ được áp dụng cho từng phần tử để tạo DoubleStream/IntStream/LongStream mới.
3. FlatMap, nhận một hàm làm tham số, thay thế từng giá trị trong luồng bằng một luồng, sau đó kết nối các luồng thành một luồng.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@Bài kiểm tra
công cộng
vô hiệu
test2(){
list.stream().map(Người dùng::getName)
.forEach(Hệ thống.out::println);
Danh sách> danh sách1 =
mới
Mảng List<>();
list1.add(danh sách);
list1.stream().flatMap(Stream::getNames)
.forEach(Hệ thống.out::println);
}
công cộng
tĩnh
Stream getNames(Danh sách danh sách){
Danh sách list1 =
mới
ArrayList();
vì
(Người dùng người dùng: danh sách) {
list1.add(người dùng.getName());
}
trở lại
list1.stream();
}
|
Loại.
1. được sắp xếp (), tạo ra một luồng mới, được sắp xếp theo thứ tự tự nhiên.
2. được sắp xếp (Bộ so sánh), tạo một luồng mới, được sắp xếp theo thứ tự so sánh.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Bài kiểm tra
công cộng
vô hiệu
test3(){
Danh sách danh sách =Arrays.asList(
"à"
,
"bb"
,
"cc"
,
"đ"
);
danh sách.stream().sorted()
.forEach(Hệ thống.out::println);
danh sách.stream().sorted((x,y) -> {
nếu như
(x.bằng(y)){
trở lại
1
;
}
khác
{
trở lại
-
1
;
}
} ).forEach(Hệ thống.out::println);
}
|
Chấm dứt hoạt động.
Thao tác chấm dứt thực thi một chuỗi các thao tác trung gian và tạo ra kết quả (luồng mới). Bản thân nguồn dữ liệu không bị ảnh hưởng và kết quả có thể là bất kỳ giá trị nào không phải là luồng.
Tìm và kết hợp.
1. allMatch, kiểm tra xem tất cả các phần tử có khớp hay không. 2. AnyMatch, kiểm tra xem có ít nhất một phần tử khớp hay không. 3. noneMatch, kiểm tra xem tất cả các phần tử có khớp hay không. 4. findFirst, trả về phần tử đầu tiên. 5. findAny, trả về bất kỳ phần tử nào trong luồng hiện tại. 6. count, trả về tổng số phần tử trong luồng. 7. max, trả về giá trị lớn nhất trong luồng. 8. min, trả về giá trị tối thiểu trong luồng. 9. lặp lại nội bộ của fEach(Consumer c).
?
1
2
3
4
5
6
7
8
9
10
11
|
@Bài kiểm tra
công cộng
vô hiệu
test4(){
Boolean
b = danh sách.luồng().
không khớp((e) ->
e.getName().bằng(
"triệu"
));
Hệ thống.out.println(b);
Tùy chọn op = list.parallelStream()
.filter((x) -> x.getAge() ==
18
)
.findAny();
System.out.println(op.get());
}
|
Giảm bớt.
less có thể kết hợp nhiều lần các giá trị trong một luồng để thu được một giá trị.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
@Bài kiểm tra
công cộng
vô hiệu
kiểm tra5() {
Danh sách list1 =list.stream()
.map(Người dùng::getName)
.collect(Collectors.toList()) ;
list1.forEach(System.out::println);
HashSet đặt = danh sách.stream().
bản đồ(Người dùng::getName)
.collect(Collectors.toCollection(HashSet::
mới
));
đặt.forEach(System.out::println);
Đếm dài = list.stream()
.collect(Người thu thập.đếm());
System.out.println(đếm);
gấp đôi
avAge = list.stream()
.collect(Collectors.averagingInt(Người dùng::getAge));
System.out.println(Tuổi trung bình);
số nguyên
toAge = list.stream()
.collect(Collectors.summingInt(Người dùng::getAge));
System.out.println(toAge);
Tùy chọn u = list.stream()
.thu thập(Bộ sưu tập.maxBy((e1,e2)
-> Integer.so sánh(e1.getAge(),e2.getAge() )));
Hệ thống.out.println(u);
IntSummaryStatistics thu thập = list.stream()
.collect(Collectors.summarizingInt(Người dùng::getAge));
System.out.println(collect.getAverage());
Bản đồ> l= list.stream()
.collect(Người thu thập.groupingBy(Người dùng::getAge));
Hệ thống.out.println(l);
Bản đồ> > ls= list.stream()
.thu thập(Người thu thập.nhómTheo(
Người dùng::getAge, Collectors.groupingBy(Người dùng::getSex)));
System.out.println(ls);
Bản đồ> bản đồ= danh sách.stream()
.collect(Bộ sưu tập.phân vùngBởi((x)
-> x.getAge()>
18
));
System.out.println(bản đồ);
Chuỗi str = list.stream().map(User::getName)
.collect(Người thu thập.tham gia(
","
,
"-"
,
"-"
));
System.out.println(chuỗi);
}
|
Tóm tắt.
Trên đây là phần giải thích chi tiết về ví dụ phát trực tuyến tính năng mới của Java 8 do người biên tập giới thiệu. Tôi hy vọng nó sẽ hữu ích cho bạn. Nếu bạn có bất kỳ câu hỏi nào, vui lòng để lại tin nhắn cho tôi và người biên tập sẽ trả lời bạn kịp thời. Tôi cũng xin cảm ơn mọi người đã ủng hộ trang web của tôi! .
Liên kết gốc: http://blog.csdn.net/l18637220680/article/details/78323998?utm_source=tuicool&utm_medium=referral.
Cuối cùng, bài viết giải thích chi tiết về phiên bản luồng luồng tính năng mới của Java8 có ở đây. Nếu bạn muốn biết thêm về giải thích chi tiết về phiên bản luồng luồng tính năng mới của Java8, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. bạn sẽ hỗ trợ nó trong tương lai blog của tôi! .
Tôi là một lập trình viên xuất sắc, rất giỏi!