Một
List list = new ArrayList[c];3 đại diện cho một nhóm các đối tượng được gọi là các phần tử của nó. Giao diện
List list = new ArrayList[c];3 được sử dụng để chuyển qua các bộ sưu tập đối tượng nơi mong muốn tính tổng quát tối đa. Ví dụ: theo quy ước, tất cả các triển khai bộ sưu tập có mục đích chung đều có hàm tạo nhận đối số
List list = new ArrayList[c];3. Hàm tạo này, được gọi là hàm tạo chuyển đổi, khởi tạo bộ sưu tập mới để chứa tất cả các phần tử trong bộ sưu tập đã chỉ định, bất kể giao diện con của bộ sưu tập đã cho hoặc kiểu triển khai. Nói cách khác, nó cho phép bạn chuyển đổi kiểu của bộ sưu tập
Ví dụ: giả sử bạn có một
List list = new ArrayList[c];6, có thể là một
List list = new ArrayList[c];7, một
List list = new ArrayList[c];8 hoặc một loại
List list = new ArrayList[c];3 khác. Thành ngữ này tạo một
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];0 mới [một triển khai của giao diện
List list = new ArrayList[c];7], ban đầu chứa tất cả các phần tử trong
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2
List list = new ArrayList[c];0Hoặc - nếu bạn đang sử dụng JDK 7 trở lên - bạn có thể sử dụng toán tử kim cương
List list = new ArrayList[c];
Giao diện
List list = new ArrayList[c];3 chứa các phương thức thực hiện các thao tác cơ bản, chẳng hạn như
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];4,
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];5,
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];6,
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];7,
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];8 và
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];9
Nó cũng chứa các phương thức hoạt động trên toàn bộ bộ sưu tập, chẳng hạn như
List list = new ArrayList[c];90,
List list = new ArrayList[c];91,
List list = new ArrayList[c];92,
List list = new ArrayList[c];93 và
List list = new ArrayList[c];94
Các phương thức bổ sung cho hoạt động mảng [chẳng hạn như
List list = new ArrayList[c];95 và
List list = new ArrayList[c];96 cũng tồn tại
Trong JDK 8 trở lên, giao diện
List list = new ArrayList[c];3 cũng hiển thị các phương thức
List list = new ArrayList[c];98 và
List list = new ArrayList[c];99, để lấy các luồng tuần tự hoặc song song từ bộ sưu tập bên dưới. [Xem bài học có tên Hoạt động tổng hợp để biết thêm thông tin về cách sử dụng luồng. ]
Giao diện
List list = new ArrayList[c];3 thực hiện những gì bạn mong đợi với điều kiện là một
List list = new ArrayList[c];3 đại diện cho một nhóm đối tượng. Nó có các phương thức cho bạn biết có bao nhiêu phần tử trong tập hợp [
List list = new ArrayList[c];12,
List list = new ArrayList[c];13], các phương thức kiểm tra xem một đối tượng đã cho có trong tập hợp hay không [
List list = new ArrayList[c];14], các phương thức thêm và xóa một phần tử khỏi tập hợp [
List list = new ArrayList[c];15,
List list = new ArrayList[c];16], và các phương thức cung cấp một trình vòng lặp trong bộ sưu tập [
List list = new ArrayList[c];17]
Phương thức
List list = new ArrayList[c];15 được định nghĩa chung đủ để nó có ý nghĩa đối với các bộ sưu tập cho phép trùng lặp cũng như những bộ sưu tập không. Nó đảm bảo rằng
List list = new ArrayList[c];3 sẽ chứa phần tử được chỉ định sau khi cuộc gọi hoàn thành và trả về
List list = new ArrayList[c];90 nếu
List list = new ArrayList[c];3 thay đổi do cuộc gọi. Tương tự như vậy, phương thức
List list = new ArrayList[c];16 được thiết kế để loại bỏ một phiên bản duy nhất của phần tử đã chỉ định khỏi
List list = new ArrayList[c];3, giả sử rằng nó chứa phần tử để bắt đầu và trả về
List list = new ArrayList[c];90 nếu kết quả là
List list = new ArrayList[c];3 đã được sửa đổi
Bộ sưu tập duyệt qua
Có ba cách để duyệt qua các bộ sưu tập. [1] sử dụng các hoạt động tổng hợp [2] với cấu trúc
List list = new ArrayList[c];96 và [3] bằng cách sử dụng các
List list = new ArrayList[c];97
Hoạt động tổng hợp
Trong JDK 8 trở lên, phương pháp lặp ưu tiên hơn một bộ sưu tập là lấy một luồng và thực hiện các thao tác tổng hợp trên đó. Các hoạt động tổng hợp thường được sử dụng cùng với các biểu thức lambda để làm cho chương trình trở nên rõ ràng hơn, sử dụng ít dòng mã hơn. Đoạn mã sau tuần tự lặp qua một tập hợp các hình dạng và in ra các đối tượng màu đỏ
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];
Tương tự như vậy, bạn có thể dễ dàng yêu cầu một luồng song song, điều này có thể hợp lý nếu bộ sưu tập đủ lớn và máy tính của bạn có đủ lõi
List list = new ArrayList[c];9
Có nhiều cách khác nhau để thu thập dữ liệu với API này. Ví dụ: bạn có thể muốn chuyển đổi các phần tử của đối tượng
List list = new ArrayList[c];3 thành
List list = new ArrayList[c];99, sau đó nối chúng lại, phân tách bằng dấu phẩy
List list = new ArrayList[c];1
Hoặc có lẽ tôi là tiền lương của tất cả nhân viên
List list = new ArrayList[c];9
Đây chỉ là một vài ví dụ về những gì bạn có thể làm với luồng và hoạt động tổng hợp. Để biết thêm thông tin và ví dụ, hãy xem bài học có tiêu đề Hoạt động tổng hợp
Khung Bộ sưu tập luôn cung cấp một số cái gọi là "hoạt động hàng loạt" như một phần của API. Chúng bao gồm các phương pháp hoạt động trên toàn bộ bộ sưu tập, chẳng hạn như
List list = new ArrayList[c];30,
List list = new ArrayList[c];31,
List list = new ArrayList[c];32, v.v. Đừng nhầm lẫn các phương thức đó với các thao tác tổng hợp đã được giới thiệu trong JDK 8. Sự khác biệt chính giữa các hoạt động tổng hợp mới và các hoạt động hàng loạt hiện có [
List list = new ArrayList[c];30,
List list = new ArrayList[c];31, v.v. ] là tất cả các phiên bản cũ đều có tính đột biến, nghĩa là tất cả chúng đều sửa đổi bộ sưu tập cơ bản. Ngược lại, các hoạt động tổng hợp mới không sửa đổi bộ sưu tập cơ bản. Khi sử dụng các phép toán tổng hợp và biểu thức lambda mới, bạn phải cẩn thận tránh thay đổi để không gây ra sự cố trong tương lai, nếu mã của bạn được chạy sau đó từ một luồng song song
cho mỗi cấu trúc
Cấu trúc
List list = new ArrayList[c];96 cho phép bạn duyệt chính xác một tập hợp hoặc mảng bằng cách sử dụng vòng lặp
List list = new ArrayList[c];36 — xem Câu lệnh for. Đoạn mã sau sử dụng cấu trúc
List list = new ArrayList[c];96 để in ra từng phần tử của tập hợp trên một dòng riêng biệt
List list = new ArrayList[c];3
Một
List list = new ArrayList[c];97 là một đối tượng cho phép bạn duyệt qua một bộ sưu tập và loại bỏ các phần tử khỏi bộ sưu tập một cách có chọn lọc, nếu muốn. Bạn nhận được một
List list = new ArrayList[c];97 cho một bộ sưu tập bằng cách gọi phương thức
List list = new ArrayList[c];17 của nó. Sau đây là giao diện
List list = new ArrayList[c];97
List list = new ArrayList[c];6
Phương thức
List list = new ArrayList[c];62 trả về
List list = new ArrayList[c];90 nếu phép lặp có nhiều phần tử hơn và phương thức
List list = new ArrayList[c];64 trả về phần tử tiếp theo trong phép lặp. Phương thức
List list = new ArrayList[c];16 loại bỏ phần tử cuối cùng được trả về bởi
List list = new ArrayList[c];64 khỏi
List list = new ArrayList[c];3 bên dưới. Phương thức
List list = new ArrayList[c];16 chỉ có thể được gọi một lần cho mỗi lần gọi tới
List list = new ArrayList[c];64 và đưa ra một ngoại lệ nếu quy tắc này bị vi phạm
Lưu ý rằng
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];50 là cách an toàn duy nhất để sửa đổi bộ sưu tập trong quá trình lặp lại;
Sử dụng
List list = new ArrayList[c];97 thay vì cấu trúc
List list = new ArrayList[c];96 khi bạn cần
- Xóa phần tử hiện tại. Cấu trúc
List list = new ArrayList[c];
96 ẩn iterator, vì vậy bạn không thể gọiList list = new ArrayList[c];
16. Do đó, cấu trúcList list = new ArrayList[c];
96 không dùng được để lọc - Lặp lại song song nhiều bộ sưu tập
Phương pháp sau đây chỉ cho bạn cách sử dụng một
List list = new ArrayList[c];97 để lọc một
List list = new ArrayList[c];3 tùy ý — nghĩa là duyệt qua bộ sưu tập để loại bỏ các phần tử cụ thể
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];5
Đoạn mã đơn giản này là đa hình, có nghĩa là nó hoạt động với mọi
List list = new ArrayList[c];3 bất kể triển khai. Ví dụ này cho thấy việc viết một thuật toán đa hình bằng Java Collections Framework dễ dàng như thế nào
Giao diện bộ sưu tập Hoạt động hàng loạt
Thao tác hàng loạt thực hiện thao tác trên toàn bộ
List list = new ArrayList[c];3. Bạn có thể triển khai các thao tác tốc ký này bằng các thao tác cơ bản, mặc dù trong hầu hết các trường hợp, việc triển khai như vậy sẽ kém hiệu quả hơn. Sau đây là các hoạt động hàng loạt
List list = new ArrayList[c];
30 — trả vềList list = new ArrayList[c];
90 nếu mục tiêuList list = new ArrayList[c];
3 chứa tất cả các phần tử trongList list = new ArrayList[c];
3 đã chỉ địnhList list = new ArrayList[c];
31 — thêm tất cả các yếu tố trongList list = new ArrayList[c];
3 được chỉ định vào mục tiêuList list = new ArrayList[c];
3List list = new ArrayList[c];
32 - xóa khỏi mục tiêuList list = new ArrayList[c];
3 tất cả các phần tử của nó cũng được chứa trongList list = new ArrayList[c];
3 đã chỉ địnhList list = new ArrayList[c];
00 - xóa khỏi mục tiêuList list = new ArrayList[c];
3 tất cả các phần tử của nó không có trongList list = new ArrayList[c];
3 đã chỉ định. Nghĩa là, nó chỉ giữ lại những phần tử trongList list = new ArrayList[c];
3 đích cũng được chứa trongList list = new ArrayList[c];
3 đã chỉ địnhList list = new ArrayList[c];
05 - xóa tất cả các phần tử khỏiList list = new ArrayList[c];
3
Các phương thức
List list = new ArrayList[c];31,
List list = new ArrayList[c];32 và
List list = new ArrayList[c];00 đều trả về
List list = new ArrayList[c];90 nếu mục tiêu
List list = new ArrayList[c];3 đã được sửa đổi trong quá trình thực hiện thao tác
Là một ví dụ đơn giản về sức mạnh của các hoạt động hàng loạt, hãy xem xét thành ngữ sau để loại bỏ tất cả các phiên bản của một phần tử được chỉ định,
List list = new ArrayList[c];12, khỏi một
List list = new ArrayList[c];3,
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2
List list = new ArrayList[c];11
Cụ thể hơn, giả sử bạn muốn xóa tất cả các phần tử
List list = new ArrayList[c];15 khỏi một
List list = new ArrayList[c];3
List list = new ArrayList[c];0
Thành ngữ này sử dụng
List list = new ArrayList[c];17, là một phương thức xuất xưởng tĩnh trả về một
List list = new ArrayList[c];8 bất biến chỉ chứa phần tử đã chỉ định
Thao tác với mảng giao diện bộ sưu tập
Các phương thức
List list = new ArrayList[c];19 được cung cấp như một cầu nối giữa các bộ sưu tập và các API cũ hơn mong đợi các mảng trên đầu vào. Các thao tác trên mảng cho phép dịch nội dung của
List list = new ArrayList[c];3 thành một mảng. Biểu mẫu đơn giản không có đối số tạo ra một mảng mới của
List list = new ArrayList[c];21. Dạng phức tạp hơn cho phép người gọi cung cấp một mảng hoặc chọn kiểu thời gian chạy của mảng đầu ra
Ví dụ, giả sử rằng
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2 là một
List list = new ArrayList[c];3. Đoạn mã sau kết xuất nội dung của
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2 vào một mảng mới được phân bổ của
List list = new ArrayList[c];21 có độ dài bằng với số lượng phần tử trong
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2
List list = new ArrayList[c];1
Giả sử rằng
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2 được biết là chỉ chứa các chuỗi [có lẽ vì
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2 thuộc loại
List list = new ArrayList[c];3]. Đoạn mã sau kết xuất nội dung của
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2 vào một mảng mới được phân bổ của
List list = new ArrayList[c];99 có độ dài bằng với số lượng phần tử trong
myShapesCollection.stream[] .filter[e -> e.getColor[] == Color.RED] .forEach[e -> System.out.println[e.getName[]]];2