2014-09-12 20 views
5

Tôi có đoạn mã sau:Vòng lặp nâng cao Java: (không) được đánh giá trong tiêu đề của vòng lặp là gì?

for (Attribute thisAttribute : factor.getAttributes()) { 
// blabla 
} 

nơi factor.getAttributes() lợi nhuận List<Attribute>.

Rõ ràng, chỉ có một cuộc gọi ban đầu là factor.getAttributes() và sau đó bắt đầu truyền tải. Tuy nhiên, tôi không hiểu tại sao chỉ có một cuộc gọi. Nếu tôi đã bao gồm một cuộc gọi chức năng trong tiêu đề của một vòng lặp thường xuyên for(), tôi tin rằng nó sẽ được đánh giá ở mỗi lần lặp. Trong khía cạnh đó, làm thế nào và tại sao là vòng lặp tiên tiến khác nhau?

+0

Đối với mỗi vòng lặp là một bit khác nhau cho bình thường cho vòng lặp. Bạn cần phải hiểu rằng một cho mỗi vòng lặp, chúng tôi nhận được bộ sưu tập và sử dụng trình lặp để lặp lại mặc dù nó. – StackFlowed

+0

Vậy làm thế nào để JVM biết rằng tôi muốn thu thập chỉ một lần ngay từ đầu? – James

+2

Phụ thuộc vào phần đầu vòng lặp mà bạn đang nói về tần suất một cái gì đó được gọi. Trong một vòng lặp cổ điển, 'for (int i = getStartInt(); i ajp15243

Trả lời

7

nghĩ về nó như việc dịch sang cái gì đó như:

{ 
    Iterator<Attribute> it = factor.getAttributes().iterator(); 
    while (it.hasNext()) { 
     Attribute thisAttribute = it.next(); 
     // loop body here 
    } 
} 

Trình biên dịch biết nó được một Iterable, nó có thể nhận được Iterator từ nó một lần và sử dụng nó trong vòng lặp.

Nó chỉ ra các Java language specification dường như đồng ý, nó nói:

Các tăng cường cho tuyên bố là tương đương với một cơ sở cho tuyên bố có dạng:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    {VariableModifier} TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 
+3

Nitpicking: Không phải đó là 'Iterator it = factor.getAttributes(). Terator();'? –

+2

Tham chiếu JLS: http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2 –

+0

@Aeshang: đã được phê duyệt, cảm ơn bạn. –

Các vấn đề liên quan