【发布时间】:2012-01-23 07:20:11
【问题描述】:
我是 Java 新手,想知道如何实现像 Ruby 的 .each 这样的方法,以便更轻松地迭代数组和列表等类?
【问题讨论】:
-
有许多实现,但由于需要创建接口实现,它们都很庞大。在 Java 8 关闭之前,您应该评估它们是否真的是您想要的。如果您编写大量具体的函子,它们就会有意义。
标签: java ruby loops for-loop each
我是 Java 新手,想知道如何实现像 Ruby 的 .each 这样的方法,以便更轻松地迭代数组和列表等类?
【问题讨论】:
标签: java ruby loops for-loop each
【讨论】:
虽然在标准 Java 中实现它确实有点尴尬,但一些流行的库(您甚至可能已经在使用)提供了一个 Predicate 接口,至少可以为您节省大量的编写工作.最棒的是,它们还提供经过彻底测试、经过验证的帮助程序类,这意味着您不必编写迭代代码。
查看 Google Guava 的 Iterables 类 - 您可以执行 filter()、findIf() 和 removeIf() 之类的操作。如果使用得当,这些方法可以得到非常易读的结果。
Apache 的 Commons Collections 在CollectionUtils 中提供了类似的东西。 find()、filter() 和 select() 等方法都采用 Predicate。
Google Guava 还更进一步,为您提供了 Predicates 助手,它有一个 whole load 的罐装 Predicate 实例 - 例如 isNull、containsPattern 和 isInstanceOf。
如果您想避免为这些东西重新发明轮子,请查看它们。
【讨论】:
由于缺少闭包,它变得丑陋,直到 Java 8,但这里是:
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class EachTest {
interface ItemProcessor<T>{
void process(T item);
}
static <T> void each(Collection<T> collection, ItemProcessor<T> processor){
for (T item: collection){
processor.process(item);
}
}
public static void main(String[] args) {
List<String> list=Arrays.asList(new String("foo"),"bar");
EachTest.<String>each(list,new ItemProcessor<String>() {
@Override
public void process(String item) {
System.out.println(item);
}
});
}
}
我认为在 Java 8 中,它会是(但不要引用我的话):
public static void main(String[] args) {
List<String> list=Arrays.asList(new String("foo"),"bar");
EachTest.<String>each(list,String item=>System.out.println(item));
}
【讨论】:
-> 而不是=>。
您不能像 Ruby 那样创建 each 函数,因为 Java 不像 Ruby 那样接受块作为参数。您可以使用接口并提供匿名类定义,但这比仅对每个构造使用 Java 更复杂。要在 Java 中为每个,您可以执行以下操作:
String[] myStrings = { "a", "b", "c" };
for (String str : myStrings) {
// Do something with each String value.
System.out.println(str);
}
【讨论】:
for 循环编写完整的语法。
您可以使用Iterator 来完成,也可以使用特殊版本的 for:
ArrayList<String> strings = ...;
for (String str : strings) {
System.out.println(str);
}
【讨论】: