我是Java的新手,想知道如何实现像Ruby的.each
这样的方法来使迭代像数组和列表这样的类更容易?
虽然在标准Java中实现这一点确实有点尴尬,但是有几个流行的库(您甚至可能已经在使用)提供了Predicate
接口,至少可以为您节省大量的编写工作。最棒的是它们还提供了经过彻底测试的、经过验证的助手类,这意味着您不必编写迭代代码。查看Google Guava的Iterables类-你可以做像filter()
, findIf()
和removeIf()
这样的事情。如果使用得当,这些方法可以产生非常可读的结果。
find()
、filter()
和select()
等方法都取Predicate
。
Google Guava还更进一步,为您提供了Predicates
助手,其中包含完整的罐装Predicate
实例-如isNull
, containsPattern
和isInstanceOf
。
如果你想避免为这些东西重新发明轮子,请查看它们。
你不能像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);
}
在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));
}
您可以使用Iterator来实现,也可以使用特殊版本的for:
ArrayList<String> strings = ...;
for (String str : strings) {
System.out.println(str);
}
考虑命令模式:
http://en.wikipedia.org/wiki/Command_pattern Java