zoukankan      html  css  js  c++  java
  • 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遍历数组。

  • 相关阅读:
    爬取校园新闻首页的新闻的详情,使用正则表达式,函数抽离
    网络爬虫基础练习
    Mysql 使用 select into outfile
    Mysql 使用CMD 登陆
    使用Clean() 去掉由函数自动生成的字符串中的双引号
    Get Resultset from Oracle Stored procedure
    获取引用某个主键的所有外键的表
    Entity Framework 丢失数据链接的绑定,在已绑好的EDMX中提示“Choose Your Data Connection”
    添加MySql Metat Database 信息
    at System.Data.EntityClient.EntityConnection.GetFactory(String providerString)
  • 原文地址:https://www.cnblogs.com/fanlumaster/p/13672499.html
Copyright © 2011-2022 走看看