在PHP中,可以foreach($array as $key=>$value){//codes
。是否可以在Java中创建一个函数foreach(arr,function(key,value){//codes});
?
我不擅长Java。要使功能起作用,它必须接受所有数据类型。另外,我不确定是否可以在Java中使用回调函数。
P.S。 “不可能”是一个有效的答案,谢谢!
答案 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
,这是一个键值集合。如果您只想迭代普通集合,例如Lists
和Arrays
,您可以这样做:
List<String> strings = new ArrayList<String>();
....
for(String str : strings)
{
System.out.println(str);
}
答案 7 :(得分:0)