java陣列可遍歷但是不能作為Iterable引數傳遞
阿新 • • 發佈:2020-09-15
foreach語句可以用於陣列或其他任何Iterable,但是這並不意味著陣列肯定也是一個Iterable,而任何自動包裝類也不會自動發生:
//: holding/ArrayIsNotIterable.java import java.util.*; public class ArrayIsNotIterable { static <T> void test(Iterable<T> ib) { for(T t : ib) System.out.print(t + " "); } public static void main(String[] args) { test(Arrays.asList(1, 2, 3)); String[] strings = { "A", "B", "C" }; // An array works in foreach, but it's not Iterable: //! test(strings); // 直接自認為陣列是Iterable,然後把陣列傳入test方法,會報錯 // You must explicitly convert it to an Iterable: // 必須明確地把它轉化成一個Iterable型別 test(Arrays.asList(strings)); } } /* Output: 1 2 3 A B C *///:~
嘗試把陣列當作一個Iterable引數傳遞會導致失敗。這說明不存在任何從陣列到Iterable的自動轉換,你必須手工執行這種轉換。
陣列直接foreach遍歷的示例:
//: net/mindview/util/Hex.java package net.mindview.util; import java.io.*; public class Hex { public static String format(byte[] data) { StringBuilder result = new StringBuilder(); int n = 0; for(byte b : data) { if(n % 16 == 0) result.append(String.format("%05X: ", n)); result.append(String.format("%02X ", b)); n++; if(n % 16 == 0) result.append("\n"); } result.append("\n"); return result.toString(); } public static void main(String[] args) throws Exception { if(args.length == 0) // Test by displaying this class file: System.out.println( format(BinaryFile.read("Hex.class"))); else System.out.println( format(BinaryFile.read(new File(args[0])))); } } /* Output: (Sample) 00000: CA FE BA BE 00 00 00 31 00 52 0A 00 05 00 22 07 00010: 00 23 0A 00 02 00 22 08 00 24 07 00 25 0A 00 26 00020: 00 27 0A 00 28 00 29 0A 00 02 00 2A 08 00 2B 0A 00030: 00 2C 00 2D 08 00 2E 0A 00 02 00 2F 09 00 30 00 00040: 31 08 00 32 0A 00 33 00 34 0A 00 15 00 35 0A 00 00050: 36 00 37 07 00 38 0A 00 12 00 39 0A 00 33 00 3A ... *///:~
其中:
for(byte b : data) {
if(n % 16 == 0)
result.append(String.format("%05X: ", n));
result.append(String.format("%02X ", b));
n++;
if(n % 16 == 0) result.append("\n");
}
這裡就是直接foreach遍歷陣列。