Python và cách triển khai của nó

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];
0

Hoặ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ọi
    List list = new ArrayList[c];
    
    16. Do đó, cấu trúc
    List 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êu
    List list = new ArrayList[c];
    
    3 chứa tất cả các phần tử trong
    List list = new ArrayList[c];
    
    3 đã chỉ định
  • List list = new ArrayList[c];
    
    31 — thêm tất cả các yếu tố trong
    List list = new ArrayList[c];
    
    3 được chỉ định vào mục tiêu
    List list = new ArrayList[c];
    
    3
  • List list = new ArrayList[c];
    
    32 - xóa khỏi mục tiêu
    List list = new ArrayList[c];
    
    3 tất cả các phần tử của nó cũng được chứa trong
    List list = new ArrayList[c];
    
    3 đã chỉ định
  • List list = new ArrayList[c];
    
    00 - xóa khỏi mục tiêu
    List list = new ArrayList[c];
    
    3 tất cả các phần tử của nó không có trong
    List list = new ArrayList[c];
    
    3 đã chỉ định. Nghĩa là, nó chỉ giữ lại những phần tử trong
    List list = new ArrayList[c];
    
    3 đích cũng được chứa trong
    List list = new ArrayList[c];
    
    3 đã chỉ định
  • List list = new ArrayList[c];
    
    05 - xóa tất cả các phần tử khỏi
    List 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

Chủ Đề