Есть ли в guava эквивалент функции редукции в Python? - PullRequest
20 голосов
/ 17 февраля 2011

Есть ли у guava (или другой библиотеки java) что-то вроде функции redu () в Python?

Я ищу что-то вроде этого http://docs.python.org/library/functions.html#reduce

Ответы [ 8 ]

7 голосов
/ 17 февраля 2011

Нет.Это может в конечном итоге, хотя такие функциональные вещи не являются основной целью Guava.См. этот выпуск .

6 голосов
/ 17 февраля 2011

Мне (пока) не удалось найти библиотеки библиотек Java, поддерживающие map и reduce.(Я исключаю отображение / уменьшение функциональности в средах параллельной / распределенной обработки ... потому что вам нужна "большая" проблема для этих платформ.)

Возможно, причина этого "недостатка" заключается в том, что карта/ Сократить кодирование без замыканий просто слишком громоздко.Слишком много стандартного кода, слишком сложный синтаксис.Поскольку основной смысл использования примитивов map / lower в простых коллекциях состоит в том, чтобы сделать ваш код простым и элегантным ...


@ CurtainDog предоставил ссылку на lambdaj .Это делает то, что нужно после ОП (хотя нет метода, специально называемого reduce).Но это иллюстрирует то, что я говорил о шаблоне.Обратите внимание, что многие операции более высокого порядка включают создание классов, расширяющих один или другой из классов Closure.

(FWIW, я думаю, что методы Lambda.aggregate(...) являются лямбда-аналогомreduce.)

5 голосов
/ 06 января 2015

Java 8 потоки позволяют вам сделать это.

mylist.stream().map((x) -> x + 1).reduce((a,b) -> a + b)

Для получения дополнительной информации: http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

4 голосов
/ 30 сентября 2012

Гуава имеет преобразование (карта). Кажется, что сокращение отсутствует, хотя?

4 голосов
/ 27 марта 2011

Джедай имеет уменьшение . Джедай также помогает уменьшить плиту котла, используя аннотации для создания функторов для вас. Смотрите эти примеры .

4 голосов
/ 17 февраля 2011

Я недавно представил вопрос , где я запросил / обсудил нечто подобное. Это то, что потребуется в моей реализации

/**
 * Aggregate the selected values from the supplied {@link Iterable} using
 * the provided selector and aggregator functions.
 * 
 * @param <I>
 *            the element type over which to iterate
 * @param <S>
 *            type of the values to be aggregated
 * @param <A>
 *            type of the aggregated value
 * @param data
 *            elements for aggregation
 * @param selectorFunction
 *            a selector function that extracts the values to be aggregated
 *            from the elements
 * @param aggregatorFunction
 *            function that performs the aggregation on the selected values
 * @return the aggregated value
 */
public static <I, S, A> A aggregate(final Iterable<I> data,
    final Function<I, S> selectorFunction,
    final Function<Iterable<S>, A> aggregatorFunction){
    checkNotNull(aggregatorFunction);
    return aggregatorFunction.apply(
        Iterables.transform(data, selectorFunction)
    );
}

(функция селектора может извлекать значение для агрегирования из объекта к запросу, но во многих случаях это будет Functions.identity(), т. Е. Сам объект является тем, что агрегируется)

Это не классический фолд, но для выполнения работы требуется Function<Iterable<X>,X>. Но поскольку настоящий код является однострочным, я вместо этого решил запросить некоторые стандартные функции-агрегаторы (я бы поместил их в класс, называемый как Aggregators, AggregatorFunctions или даже Functions.Aggregators):

/** A Function that returns the average length of the Strings in an Iterable. */
public static Function<Iterable<String>,Integer> averageLength()

/** A Function that returns a BigDecimal that corresponds to the average
    of all numeric values passed from the iterable. */
public static Function<Iterable<? extends Number>,BigDecimal> averageOfFloats()

/** A Function that returns a BigInteger that corresponds to the average
    of all numeric values passed from the iterable. */
public static Function<Iterable<? extends Number>,BigInteger> averageOfIntegers()

/** A Function that returns the length of the longest String in an Iterable. */    
public static Function<Iterable<String>,Integer> maxLength()

/** A Function that returns the length of the shortest String in an Iterable. */
public static Function<Iterable<String>,Integer> minLength()

/** A Function that returns a BigDecimal that corresponds to the sum of all
    numeric values passed from the iterable. */
public static Function<Iterable<? extends Number>,BigDecimal> sumOfFloats()

/** A Function that returns a BigInteger that corresponds to the integer sum
    of all numeric values passed from the iterable. */
public static Function<Iterable<? extends Number>,BigInteger> sumOfIntegers()

(Вы можете увидеть мои примеры реализации в выпуске)

Таким образом, вы можете делать такие вещи:

int[] numbers = { 1, 5, 6, 9, 11111, 54764576, 425623 };
int sum = Aggregators.sumOfIntegers().apply(Ints.asList(numbers)).intValue();

Это определенно не то, о чем вы просите, но во многих случаях это будет проще, и оно будет совпадать с вашим запросом (даже если подход другой).

0 голосов
/ 03 октября 2013

Я разработал библиотеку для отображения / фильтрации / сокращения со стандартным J2SE.Извините, это на французском, но с помощью Google Translate вы можете прочитать его: http://caron -yann.developpez.com / tutoriels / java / fonction-object-design-pattern-обслуживанииant-closures-java-8 /

Вы можете использовать, если это так:

int sum = dogs.filter(new Predicate<Arguments2<Dog, Integer>>() {

    @Override
    public Boolean invoke(Arguments2<Dog, Integer> arguments) {
        // filter on male
        return arguments.getArgument1().getGender() == Dog.Gender.MALE;
    }
}).<Integer>map(new Function<Integer, Arguments2<Dog, Integer>>() {

    @Override
    public Integer invoke(Arguments2<Dog, Integer> arguments) {
        // get ages
        return arguments.getArgument1().getAge();
    }
}).reduce(new Function<Integer, Arguments2<Integer, Integer>>() {

    @Override
    public Integer invoke(Arguments2<Integer, Integer> arguments) {
        // sum âges
        return arguments.getArgument1() + arguments.getArgument2();
    }
});

System.out.println("Le cumul de l'âge des mâles est de : " + sum + " ans");

Наслаждайтесь этой помощью

0 голосов
/ 25 января 2013

Используйте Полностью Ленивый , он реализует все эти вещи еще больше.Он в основном скопировал весь функциональный подход из Clojure .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...