2011-12-19 62 views
1

我是新來的Java,不知道我怎麼會去執行像Ruby的.each的方法進行過類迭代像數組和列表更容易?如何在Java中實現Ruby的「.each」方法?

+1

有許多實現的,但他們因爲需要創建一個接口實現所有笨重。在Java 8關閉之前,你應該評估它們是否真的是你想要的。如果你編寫了很多具體的函數,它們可以是有意義的。 – 2011-12-19 02:55:18

回答

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); 
} 
+0

好的。我有一種預感可能是不可能的。我真的想避免爲'for'循環編寫完整的語法。 – 2011-12-19 03:44:42

+0

說實話,樣板代碼不是太多;唯一的區別(根據冗長)是你必須指定類型。 – 2011-12-19 04:24:42

+0

是的,你是對的。只是寫java所有東西似乎都非常冗長。我認爲這是正確的答案,因爲這是最理智的做法。謝謝回答。 – 2011-12-26 05:50:43

0

您可以使用Iterator做到這一點,或者你可以用一個特殊的版本做:

ArrayList<String> strings = ...; 

for (String str : strings) { 
    System.out.println(str); 
} 
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)); 
} 
+0

我認爲截至上週,這將是' - >'而不是'=>'。 – 2011-12-19 10:58:42

4

雖然這是事實,這是略顯尷尬的標準Java,一對夫婦的流行的庫(以達到你甚至可以已經在使用)提供Predicate接口,至少可以節省大量的寫入工作。最重要的是,他們還提供經過全面測試,經過驗證的幫助類,這意味着您不必編寫迭代代碼

查看谷歌Guava的Iterables類 - 你可以做類似filter(),findIf()removeIf()的東西。如果使用得當,這些方法可以獲得非常可讀的結果。

Apache的Commons Collections中提供了CollectionUtils類似的東西。像find()filter()select()這樣的方法都需要Predicate

谷歌番石榴還更進一步,爲您提供了Predicates幫手其中有罐頭Predicate實例的whole load - 比如isNullcontainsPatternisInstanceOf

檢查出來,如果你想避免重新發明輪子這個東西。

+0

+1。真的需要看番石榴... – 2011-12-19 04:06:41