guava(或其他java库)在Python中是否有类似reduce()函数的东西?
的内容答案 0 :(得分:7)
没有。它可能最终,尽管像这样的功能不是番石榴的核心焦点。请参阅this issue。
答案 1 :(得分:6)
我还没有设法找到支持map
和reduce
的任何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>
来完成工作。但由于实际代码是单行代码,我选择了请求一些标准的聚合器函数(我将它们放在一个名为Aggregators
,AggregatorFunctions
甚至{{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)
答案 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");
享受此帮助