3

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

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

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

4

8 回答 8

9

是的你可以:

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...
}
于 2012-04-05T13:52:11.063 回答
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 将得到增强,以支持一流的函数/闭包/lambda 或类似的东西。有一段时间,该功能原计划用于 Java 7,但为了完成 Java 7,不得不推迟。

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

于 2012-04-05T14:16:47.640 回答
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>and替换<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));
}
于 2012-04-05T13:53:01.747 回答
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);
}
于 2012-04-05T13:52:02.223 回答
1

是的,Java有那个. Iterable它允许对数组和s进行迭代。

List<String> list = new ArrayList<>();
...
for(String s : list) { // since List<T> implements Iterable<T>.
}
于 2012-04-05T13:53:35.233 回答
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));
}
于 2012-04-05T14:06:30.873 回答
0

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

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

那应该创建一个HashMap键值集合。如果您只想遍历普通集合,例如Listsand Arrays,您可以执行以下操作:

List<String> strings = new ArrayList<String>();
....
for(String str : strings)
{
     System.out.println(str);
}
于 2012-04-05T13:53:52.673 回答