如何在 Java 中实现 Ruby 的 ".each" 方法?



我是Java的新手,想知道如何实现像Ruby的.each这样的方法来使迭代像数组和列表这样的类更容易?

虽然在标准Java中实现这一点确实有点尴尬,但是有几个流行的库(您甚至可能已经在使用)提供了Predicate接口,至少可以为您节省大量的编写工作。最棒的是它们还提供了经过彻底测试的、经过验证的助手类,这意味着您不必编写迭代代码。查看Google Guava的Iterables类-你可以做像filter(), findIf()removeIf()这样的事情。如果使用得当,这些方法可以产生非常可读的结果。

Apache的Commons Collections在CollectionUtils中提供了类似的功能。find()filter()select()等方法都取Predicate

Google Guava还更进一步,为您提供了Predicates助手,其中包含完整的罐装Predicate实例-如isNull, containsPatternisInstanceOf

如果你想避免为这些东西重新发明轮子,请查看它们。

你不能像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

最新更新