我是Java的新手,想知道如何实现像Ruby的.each
之类的方法来更轻松地迭代像数组和列表这样的类?
答案 0 :(得分:4)
虽然在标准Java中实现它有点尴尬,但是一些流行的库(你甚至可能已经在使用它们)提供了一个Predicate
接口,这样可以节省大量的写入量,至少。最棒的是,它们还提供经过全面测试,经过验证的辅助类,这意味着您不必编写迭代代码。
查看Google Guava的Iterables课程 - 您可以执行filter()
,findIf()
和removeIf()
等操作。如果使用得当,这些方法可以产生极其可读的结果。
Apache的Commons Collections在CollectionUtils中提供了类似的功能。 find()
,filter()
和select()
等方法都采用Predicate
。
Google Guava还会更进一步,为您提供Predicates
个帮助,其中包含whole load个Predicate
个实例isNull
,containsPattern
和{{}} {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)