Trình lặp nội bộ và bên ngoài trong Java là gì?Bộ lặp Iterator vs Bộ lặp nội bộ
Trả lời
Đó là về người controls the iteration.
chi tiết khác là trong câu hỏi này What are the benefits of the Iterator interface in Java?
tôi thấy description này:
ngoài vs lặp nội bộ.
Bộ lặp ngoài - khi lặp lại được điều khiển bởi đối tượng bộ sưu tập, chúng tôi nói rằng chúng tôi có Bộ lặp ngoài.
Trong các ngôn ngữ như .net hoặc java, việc tạo các trình vòng lặp bên ngoài rất dễ dàng. Trong thực hiện cổ điển của chúng tôi một trình lặp bên ngoài được thực hiện. Trong ví dụ sau một iterator bên ngoài được sử dụng:
// using iterators for a clloection of String objects:
// using in a for loop
for (Iterator it = options.iterator(); it.hasNext();) {
String name = (String)it.next();
System.out.println(name);
}
// using in while loop
Iterator name = options.iterator();
while (name.hasNext()){
System.out.println(name.next());
}
// using in a for-each loop (syntax available from java 1.5 and above)
for (Object item : options)
System.out.println(((String)item));
Vòng lặp nội bộ - Khi iterator kiểm soát nó, chúng ta có một iterator nội
Ở phía bên kia thực hiện và sử dụng vòng lặp nội bộ là thực sự khó khăn. Khi một iterator nội bộ được sử dụng nó có nghĩa là mã được chạy được ủy quyền cho đối tượng tổng hợp. Ví dụ: trong các ngôn ngữ cung cấp hỗ trợ cho việc này dễ dàng gọi các trình lặp nội bộ:
collection do: [:each | each doSomething] (Smalltalk)
Ý tưởng chính là chuyển mã được thực hiện cho bộ sưu tập. Sau đó, bộ sưu tập sẽ gọi nội bộ phương thức doSomething trên mỗi thành phần. Trong C++ nó có thể gửi phương thức doMethod như một con trỏ. Trong C#, .NET hoặc VB.NET, bạn có thể gửi phương thức này làm đại biểu. Trong java, mẫu thiết kế Functor
phải được sử dụng. Ý tưởng chính là tạo một giao diện cơ sở chỉ với một phương thức (doSomething). Sau đó, phương thức sẽ được thực hiện trong một lớp thực hiện giao diện và lớp sẽ được chuyển tới bộ sưu tập để lặp lại. Để biết thêm chi tiết, hãy xem mẫu thiết kế Functor
.
ngoài Iterator
Khi bạn nhận được một iterator và bước qua nó, đó là một iterator bên ngoài
for (Iterator iter = var.iterator(); iter.hasNext();) {
Object obj = iter.next();
// Operate on obj
}
nội Iterator
Khi bạn vượt qua một đối tượng hàm đến một phương pháp để chạy qua danh sách, đó là trình lặp nội bộ
var.each(new Functor() {
public void operate(Object arg) {
arg *= 2;
}
});
- 1. Bộ lặp trong bộ lặp
- 2. Bộ lặp song song
- 3. Bộ điều hợp dereference cho bộ lặp của con trỏ
- 4. AppEngine MapReduce NDB, InternalError lặp lại: lỗi nội bộ
- 5. Sử dụng bộ nhớ trong đệ quy vs một đồ thị lặp đi lặp lại
- 6. Lặp lại tập hợp các bộ
- 7. Nếu câu lệnh trong bộ lặp
- 8. "end()" iterator cho bộ chèn lại?
- 9. Tại sao bộ lặp vector này không gia tăng?
- 10. tất cả trừ mục cuối cùng từ Bộ lặp Iterator (a.k.a. Iterator.init)
- 11. Bộ sưu tập cải tiến Iterator
- 12. Tách một chuỗi thành một bộ lặp
- 13. Blocks, vòng lặp và biến cục bộ
- 14. Tăng trưởng bộ nhớ vòng lặp cURL
- 15. Biến cục bộ vòng lặp trong C
- 16. backbone.js lặp lại một bộ sưu tập
- 17. bộ lọc ng-lặp lại trên boolean
- 18. vòng lặp foreach với bộ đếm
- 19. lặp qua mảng với bộ ria mép
- 20. RunTime Lỗi: Bản đồ/bộ lặp không tương thích
- 21. Trường lặp lại Bộ đệm giao thức của Google C++
- 22. Các bộ lặp chung để truy cập các vectơ
- 23. ConcurrentHashMap vs HashMap đồng bộ
- 24. C++ functor để đầu ra iterator bộ chuyển đổi
- 25. Ngăn vòng lặp đồng bộ hóa mạng khi đồng bộ hóa từ mạng trong Android ContentProvider
- 26. Giải thích đồng bộ hóa các bộ sưu tập khi các trình vòng lặp được sử dụng?
- 27. Vim Lặp lại dấu chấm (".") Bộ đệm lệnh?
- 28. đồng bộ hóa (this) vs đồng bộ hóa (MyClass.class)
- 29. Cách lặp lại toàn bộ nội dung của tệp .html trong php?
- 30. Java: Lặp lại một tập trong khi nội dung của bộ đang được sửa đổi
Vì Java 5 cách ưu tiên để sử dụng một vòng lặp bên ngoài, sẽ sử dụng vòng lặp for-each: * cho (Object o: var) {// NOOP} * mặc dù nó chỉ đơn thuần là cú pháp đường cho trình lặp lặp rõ ràng bằng cách sử dụng phiên bản. – Alex
@JohannZacharee không phải là vòng lặp foreach được coi là một Iterator nội bộ, vì chúng ta không có quyền kiểm soát vòng lặp? – denis631
@ denis631 Có, tôi đồng ý rằng vòng lặp foreach hoạt động tương tự như một trình lặp nội bộ. Tôi đã không sử dụng nó như là ví dụ của tôi vì sự hiểu biết của tôi là Java chuyển đổi chúng thành một trình lặp bên ngoài tại thời gian biên dịch. Tôi đã chọn một ví dụ chức năng để minh họa rõ hơn sự khác biệt. –