【问题标题】:Is it possible to write a "foreach" function in Java?是否可以在 Java 中编写“foreach”函数?
【发布时间】:2012-04-05 13:50:20
【问题描述】:

在 PHP 中,可以使用foreach($array as $key=>$value){//codes。是否可以在Java中创建一个函数来执行foreach(arr,function(key,value){//codes});

我不太擅长 Java。为了使函数工作,它必须接受所有数据类型。另外,我不确定回调函数是否可以在 Java 中使用。

附: “不可能”是一个有效的答案,谢谢!

【问题讨论】:

  • 您得到的答案可以说明 Java 的 foreach statement,但是您关于 函数 是否存在的问题是一个很好的问题。那是你问的吗?关于回调?前六个答案没有提到回调,至少现在还没有。 :)
  • @RayToal php foreach 看起来与我们的答案相似 :)
  • 我建议阅读this question

标签: java


【解决方案1】:

是的,你可以:

List<String> ls = new ArrayList();
ls.add("Hello");
ls.add("world");
//your foreach sentence
for(String s : ls) {
    System.out.println(s);
}

这也适用于其他类。

更新

当你遍历一个列表(数组或链表)时,索引就是索引。您将需要使用替代整数来保存索引:

List<String> ls = new ArrayList();
ls.add("Hello");
ls.add("world");
//your foreach sentence
int index = 0;
for(String s : ls) {
    System.out.println("index: " + index);
    System.out.println(s);
    //put your logic here...
    //at the end, update the index manually
    index++;
}

如果你需要遍历一个 Map(基于键、值的结构),那么你应该使用@LukasEder 描述的方法(改编他的代码):

Map<K, V> array = new HashMap<K, V>();
for (Entry<K, V> entry : array.entrySet()) {
    // You have to explicitly call your callback. There is no "callback-syntax"
    // to the Java "foreach" loop
    System.out.println("key: " + entry.getKey());
    System.out.println("value: " + entry.getValue());
    //put your logic here...
}

【讨论】:

  • 是否可以访问每个数组元素的键/索引? s 在您的示例中将在每次迭代结束后消失。
【解决方案2】:

其他答案已经解释了“增强的 for 循环”语法是如何工作的。这很可能就是您所需要的。

但我想解决您实际提出的问题:

是否可以在Java中创建一个函数来做:

 foreach(arr,function(key,value){//codes});

正如所写,这将是一个将另一个函数作为参数的函数(或方法)。这在当前定义的 Java 中是不可能的。 Java 不允许将函数(或方法)视为一等对象。它们不能作为参数传递。在(当前)Java 中最接近的方法是创建一个 Function 接口,如下所示:

public interface Function {
   public void fun(Object arg1, Object arg2);
}

并按如下方式使用:

Object[] arr = ...
foreach (arr, new Function() {
    public void fun (Object key, Object value) {
        // do stuff
    }});

(我正在考虑一个事实,即 PHP 数组更像是 Java HashMap 而不是 Java 数组。这会影响你实现这种东西的方式......但它有损于我正在尝试的要点制作。)

在未来的某个时候,Java 将得到增强,以支持一流的函数/闭包/lambda 或类似的东西。有一段时间,该功能原计划用于 Java 7,但为了完成 Java 7,不得不推迟。

更新 - 现在很明显,Java 8 中支持 lambda。这项新功能已在早期版本下载中。

【讨论】:

    【解决方案3】:

    由于 PHP 数组实际上是关联数组,因此最接近您的代码的是使用 Java Map

    Map<K, V> array = new HashMap<K, V>();
    for (Entry<K, V> entry : array.entrySet()) {
      // You have to explicitly call your callback. There is no "callback-syntax"
      // to the Java "foreach" loop
      MyClass.myMethod(entry.getKey(), entry.getValue());
    }
    

    &lt;K&gt;&lt;V&gt; 替换为更具体的类型,例如Map&lt;String, String&gt;Map&lt;Integer, String&gt; 等...

    如果您使用的是真正的(索引)数组,则不能编写“foreach”循环来访问索引。您将不得不求助于索引循环:

    // Using Java arrays
    String[] array = { "a", "b", "c" };
    for (int i = 0; i < array.length; i++) {
      MyClass.myMethod(i, array[i]);
    }
    
    // Using Java Lists
    List<String> list = Arrays.asList("a", "b", "c");
    for (int i = 0; i < list.size(); i++) {
      MyClass.myMethod(i, list.get(i));
    }
    

    【讨论】:

      【解决方案4】:

      Java中有一个foreach,例如:

      List<String> list = new ArrayList<String>();
      list.add("a");
      list.add("b");
      list.add("c");
      
      for (String s : list) {
          System.out.println(s);
      }
      

      【讨论】:

      • 检查你的语法,我认为你把 C# 和 Java 搞混了
      【解决方案5】:

      是的,Java has that。它允许对数组和Iterables 进行迭代。

      List<String> list = new ArrayList<>();
      ...
      for(String s : list) { // since List<T> implements Iterable<T>.
      }
      

      【讨论】:

        【解决方案6】:

        是的。如果您正在迭代一个数组或一个实现 Iterable 的对象,那么以下语法将起作用:

        SomeType someValue=null;
        for (someValue : setOfValues) {
           ...
        }
        

        例如:

        Map<String,String> colors=new HashMap<String,String>();
        colors.put("r","red");
        colors.put("g","green");
        colors.put("b","blue");
        for (String code : colors.keySet()) {
          process(code, colors.get(code));
        }
        

        【讨论】:

          【解决方案7】:

          是的,只要您正在迭代的集合实现Iterable,您就可以。所以你可以有这样的东西:

          Map<String, Object> map = new HashMap<String, Object>();
          ...
          for (String str : map.keySet())
          {
               System.out.println(str);
          }
          

          这应该创建一个HashMap,它是一个键值集合。如果您只想遍历ListsArrays 等普通集合,您可以执行以下操作:

          List<String> strings = new ArrayList<String>();
          ....
          for(String str : strings)
          {
               System.out.println(str);
          }
          

          【讨论】:

            【解决方案8】:
            猜你喜欢
            • 2010-12-20
            • 1970-01-01
            • 1970-01-01
            • 2021-03-28
            • 2013-06-08
            • 2021-03-21
            • 2012-02-21
            • 1970-01-01
            • 2020-03-23
            相关资源
            最近更新 更多