• java数组可遍历但是不能作为Iterable参数传递


    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("
    ");
        }
        result.append("
    ");
        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("
    ");
    }
    

    这里就是直接foreach遍历数组。

  • 相关阅读:
    cpp 模版函数
    叉积
    利用scrollTop 制作图片无缝滚动
    事件绑定和时间取消
    闭包写法
    增加类,删除类,查找类
    获取元素到页面上的位置
    在IE8中如何通过javascripts改变<style />中的内容?
    有关app的一些小知识
    获取页面高宽知识
  • 原文地址:https://www.cnblogs.com/fanlumaster/p/13672499.html
Copyright © 2020-2023  润新知