番石榴是否具有Python的reduce功能?

时间:2011-02-17 00:11:37

标签: java guava functional-programming

guava(或其他java库)在Python中是否有类似reduce()函数的东西?

我正在寻找类似http://docs.python.org/library/functions.html#reduce

的内容

8 个答案:

答案 0 :(得分:7)

没有。它可能最终,尽管像这样的功能不是番石榴的核心焦点。请参阅this issue

答案 1 :(得分:6)

我还没有设法找到支持mapreduce的任何Java集合库。 (我在并行/分布式处理框架中排除map / reduce功能......因为这些框架需要一个“大”问题值得。)

可能这种“缺乏”的原因是没有闭包的map / reduce编码太麻烦了。太多的样板代码,太多的重量级语法。因为在简单集合上使用map / reduce原语的主要目的是使代码简单而优雅......


@CurtainDog提供了lambdaj的链接。这就是OP所追求的事情(虽然没有专门称为reduce的方法)。但它说明了我对样板文件的看法。请注意,许多高阶操作涉及创建扩展一个或另一个Closure类的类。

(FWIW,我认为Lambda.aggregate(...)方法是reduce的lambdaj类比。)

答案 2 :(得分:5)

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

答案 3 :(得分:4)

我最近submitted an issue在那里我要求/讨论类似的事情。这是我的实现中需要的东西

/**
 * 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>来完成工作。但由于实际代码是单行代码,我选择了请求一些标准的聚合器函数(我将它们放在一个名为AggregatorsAggregatorFunctions甚至{{1}的类中。 }):

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()

这绝对不是您所要求的,但在许多情况下会变得更容易,并且会与您的请求重叠(即使方法不同)。

答案 4 :(得分:4)

Jedi进行了reduce手术。 Jedi还通过使用注释为您生成仿函数来帮助减少锅炉板。请参阅这些examples

答案 5 :(得分:4)

番石榴有transform(地图)。似乎还缺少减少?

答案 6 :(得分:0)

使用Totally Lazy,它可以实现所有这些功能。 它基本上复制了Clojure的整个功能方法。

答案 7 :(得分:0)

我开发了一个用标准J2SE进行map / filter / reduce的库。 对不起,它是法语,但谷歌翻译,你可以阅读: http://caron-yann.developpez.com/tutoriels/java/fonction-object-design-pattern-attendant-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");

享受此帮助