奇怪的看起来番石榴代码

时间:2013-07-10 03:46:36

标签: java guava

我无法按照以下代码段进行操作:

prices = pricesService.getProductsByCategory(category);
List<Double> discountedPrices = 
    Lists.newArrayList(Iterables.transform(prices, new Function<Double, Double>() {
        public Double apply(final Double from) {
            return from *.88;
        }
    }));

我知道代码的结果是什么,并且它在单元测试中是正确的,但我并不过分熟悉番石榴或这个实现如何/为什么起作用。目前,如果列表'价格'中存在空值,它似乎也不安全吗?所以我要追求的是:

  1. 代码如何工作的一般解释。
  2. 目前是否安全?如果不是它怎么能成为?

2 个答案:

答案 0 :(得分:6)

它会创建一个新的双打列表,其原始值为0.88 *。

构造是:

匿名内部课程

这是一种有时在Java中完成回调/闭包的方法。另请参阅Java tutorial

new Function<Double, Double>() {
    public Double apply(final Double from) {
        return from *.88;
    }
}

使用上述功能进行回调

Iterables.transform(prices, *func*)

将结果转换为ArrayList

以上结果是Iterable,因此需要将其存储到列表中。另请参阅Lists.newArrayList vs new ArrayList

Lists.newArrayList( ... )

答案 1 :(得分:2)

1)因此,Guava有一个静态的util类调用Iterables,它有一个名为transform的方法,它将一个集合和一个guava Function实例作为变量。在这种情况下,开发人员使用内联匿名函数,该函数通过重写方法“apply”返回double值。

更传统的实现应该是这样的:

List<Double> discountedPrices = Lists.newArrayList();
for(Double price: prices) {
    discountedPrices.add(price * .88);
}

2)不完全确定你的意思是什么?假设您的意思是如果列表'price'包含空值会发生什么?如果是这样,番石榴在Iterables.filter(Collection,Predicate)中为您提供了另一种解决方案。在你的情况下,你想要过滤掉空值,并有一个内置的番石榴谓词为此目的。因此,在您的情况下,您可以执行以下操作:

 prices = Iterables.filter(prices, Predicates.notNull();
 List<Double> discountedPrices = Lists.newArrayList(
 Iterables.transform(prices, new Function<Double, Double>() {
        public Double apply(final Double from) {
            return from *.88;
        }
    }));

第一行返回没有空值的价格集合,第二行的行为与以前完全相同,你可以安全地假设已经删除了空值。