是否可以在Java中编写“foreach”函数?

时间:2012-04-05 13:50:20

标签: java

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

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

P.S。 “不可能”是一个有效的答案,谢谢!

8 个答案:

答案 0 :(得分:9)

是的,你可以:

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

这也适用于其他课程。

更新

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

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...
}

答案 1 :(得分:9)

其他答案解释了“增强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将得到增强,以支持一流的函数/闭包/ lambdas或类似的东西。有一段时间这个功能是针对Java 7的,但为了让Java 7完成,它们不得不推迟。

更新 - 现在很清楚,Java 8中的lambda支持。这个新功能已经在早期版本下载。

答案 2 :(得分:4)

由于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());
}

<K><V>替换为更具体的类型,例如Map<String, String>,或Map<Integer, String>等......

如果您使用的是真(索引)数组,则无法编写“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));
}

答案 3 :(得分:3)

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);
}

答案 4 :(得分:1)

是的,Java has that。它允许迭代数组和Iterable s。

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

答案 5 :(得分:1)

是。如果您正在迭代实现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));
}

答案 6 :(得分:0)

是的,只要您正在迭代的集合实现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);
}

答案 7 :(得分:0)