Подобное Python понимание списка в Java

Мы только что закончили серию испытаний на CMS и G1, используя сопоставимую эргономику. Это зависит от продукта и очень субъективно, И мы используем Java 6 (поэтому G1 находится в сборке «предварительного просмотра»), но ...

Система, использующая CMS, работает на 20% быстрее, чем G1. Это было протестировано с кучей пространства 8 ГБ и 12 ГБ, с молодой и 1,5 ГБ памяти (соответственно).

Опять же - субъективная, единая система, специфическая нагрузка - но это наш опыт.

52
задан S.Lott 22 May 2009 в 09:22
поделиться

3 ответа

По сути, вы создаете интерфейс функции:

public interface Func<In, Out> {
    public Out apply(In in);
}

, а затем передаете анонимный подкласс в ваш метод.

Ваш метод может либо применить функцию к каждому элементу на месте:

public static <T> void applyToListInPlace(List<T> list, Func<T, T> f) {
    ListIterator<T> itr = list.listIterator();
    while (itr.hasNext()) {
        T output = f.apply(itr.next());
        itr.set(output);
    }
}
// ...
List<String> myList = ...;
applyToListInPlace(myList, new Func<String, String>() {
    public String apply(String in) {
        return in.toLowerCase();
    }
});

, либо создать новый Список (в основном создавая отображение из входного списка в выходной список):

public static <In, Out> List<Out> map(List<In> in, Func<In, Out> f) {
    List<Out> out = new ArrayList<Out>(in.size());
    for (In inObj : in) {
        out.add(f.apply(inObj));
    }
    return out;
}
// ...
List<String> myList = ...;
List<String> lowerCased = map(myList, new Func<String, String>() {
    public String apply(String in) {
        return in.toLowerCase();
    }
});

Который один предпочтительнее, зависит от вашего варианта использования. Если ваш список очень велик, решение на месте может быть единственным жизнеспособным; если вы хотите применить множество различных функций к одному и тому же исходному списку для создания множества производных списков, вам понадобится версия map .

35
ответ дан 7 November 2019 в 09:18
поделиться

Библиотека Google Collections содержит множество классов для работы с коллекциями и итераторами на гораздо более высоком уровне, чем поддерживает обычная Java, и функционально (filter , карта, складка и т. д.). Он определяет интерфейсы и методы функций и предикатов, которые используют их для обработки коллекций, поэтому вам не нужно это делать. Он также имеет удобные функции, которые упрощают работу с универсальными шаблонами Java.

Я также использую Hamcrest ** для фильтрации коллекций.

17
ответ дан 7 November 2019 в 09:18
поделиться

Apache Commons CollectionsUtil.transform (Collection, Transformer) - еще один вариант.

5
ответ дан 7 November 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: