Как мне реализовать метод ".each" Руби в Java? - PullRequest
1 голос
/ 19 декабря 2011

Я новичок в Java, и мне интересно, как я могу реализовать метод, подобный .each Руби, чтобы упростить итерации по классам, таким как массивы и списки?

Ответы [ 5 ]

4 голосов
/ 19 декабря 2011

Хотя это правда, что это немного неловко достигать в стандартной Java, пара популярных библиотек (которые вы, возможно, даже уже используете) предлагают интерфейс Predicate, который избавляет вас от основной массы написания, по крайней мере , Самое замечательное в том, что они также предлагают тщательно протестированные, проверенные вспомогательные классы, которые означают , что вам не нужно писать код итерации .

Проверьте класс Google Guava Iterables - вы можете делать такие вещи, как filter(), findIf() и removeIf(). При правильном использовании эти методы могут привести к чрезвычайно читабельным результатам.

Apache Commons Collections предлагает нечто подобное в CollectionUtils . Такие методы, как find(), filter() и select(), все принимают Predicate.

Google Guava также идет дальше и дает вам Predicates помощника, который имеет всю нагрузку консервированных Predicate экземпляров - такие вещи, как isNull, containsPattern и isInstanceOf.

Проверьте их, если хотите не изобретать велосипед для этого материала.

1 голос
/ 19 декабря 2011

Вы не можете создать каждую функцию, как в Ruby, поскольку Java не принимает блоки в качестве параметров, как в Ruby. Вы можете использовать интерфейс и предоставить анонимное определение класса, но это намного сложнее, чем просто использование Java для каждой конструкции. Чтобы сделать для каждого в Java, вы можете сделать что-то вроде следующего:

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

for (String str : myStrings) {
    // Do something with each String value.
    System.out.println(str);
}
1 голос
/ 19 декабря 2011

Это становится ужасно из-за отсутствия замыканий, до 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 голосов
/ 19 декабря 2011

Рассмотрим шаблон команды:

http://en.wikipedia.org/wiki/Command_pattern#Java

0 голосов
/ 19 декабря 2011

Вы можете сделать это, используя Итератор , или вы можете сделать это с помощью специальной версии для:

ArrayList<String> strings = ...;

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