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

时间:2011-12-19 02:46:29

标签: java ruby loops for-loop each

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

5 个答案:

答案 0 :(得分:4)

虽然在标准Java中实现它有点尴尬,但是一些流行的库(你甚至可能已经在使用它们)提供了一个Predicate接口,这样可以节省大量的写入量,至少。最棒的是,它们还提供经过全面测试,经过验证的辅助类,这意味着您不必编写迭代代码

查看Google Guava的Iterables课程 - 您可以执行filter()findIf()removeIf()等操作。如果使用得当,这些方法可以产生极其可读的结果。

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

Google Guava还会更进一步,为您提供Predicates个帮助,其中包含whole loadPredicate个实例isNullcontainsPattern和{{}} {1}}。

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

答案 1 :(得分:1)

你不能像Ruby一样创建每个函数,因为Java不像Ruby那样接受块作为参数。您可以使用接口并提供匿名类定义,但这比仅为每个构造使用Java更复杂。要在Java中为每个人做,您可以执行以下操作:

String[] myStrings = { "a", "b", "c" };

for (String str : myStrings) {
    // Do something with each String value.
    System.out.println(str);
}

答案 2 :(得分:1)

由于缺少闭包而变得丑陋,直到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));
}

答案 3 :(得分:0)

您可以使用Iterator执行此操作,也可以使用特殊版本执行此操作:

ArrayList<String> strings = ...;

for (String str : strings) {
    System.out.println(str);
}

答案 4 :(得分:0)