我无法按照以下代码段进行操作:
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;
}
}));
我知道代码的结果是什么,并且它在单元测试中是正确的,但我并不过分熟悉番石榴或这个实现如何/为什么起作用。目前,如果列表'价格'中存在空值,它似乎也不安全吗?所以我要追求的是:
答案 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;
}
}));
第一行返回没有空值的价格集合,第二行的行为与以前完全相同,你可以安全地假设已经删除了空值。