这里我的第一个问题的标题真的很差,但希望我仍能得到答案!
我希望能够将以下代码段中的filterIt
- 方法链接到我现有的FluentIterable
。
我对番石榴很新(至少是它的功能性编程部分),所以请耐心等待。
import com.google.common.collect.Sets;
import org.joda.time.DateTime;
import org.joda.time.Days;
import java.util.Set;
public class Blah {
private DateTime date;
private Blah(final DateTime date) {
this.date = date;
}
public static void main(String[] args) {
Set<Blah> blahs = Sets.newHashSet(
new Blah(DateTime.now()),
new Blah(DateTime.now().minusDays(10)),
new Blah(DateTime.now().minusDays(21)),
new Blah(DateTime.now().minusDays(15))
);
Set<Blah> filteredBlahs = filterIt(blahs);
final int filtered = blahs.size() - filteredBlahs.size();
System.out.println(filtered + " results were filtered out");
}
private static Set<Blah> filterIt(final Set<Blah> blahs) {
final Set<Blah> filteredBlahs = Sets.newHashSet();
for (Blah currentBlah : blahs) {
final DateTime currentDate = currentBlah.date;
for (Blah blah : blahs) {
if (blah != currentBlah && !filteredBlahs.contains(blah)) {
final Days days = Days.daysBetween(currentDate, blah.date);
if (Math.abs(days.getDays()) < 5) {
filteredBlahs.add(currentBlah);
filteredBlahs.add(blah);
}
}
}
}
return filteredBlahs;
}
}
快速编写此代码作为我想要实现的示例。我的问题是,我希望这种类型的过滤在其他一些转换过程中发生,并且能够将其链接而不是将其拆分为不同的Iterables
将使流程更容易理解。
我非常欢迎任何有关如何改进问题或澄清问题的反馈意见!
答案 0 :(得分:3)
NO。
详细说明:你可以写Function
来提取日期,你可以写Predicates
来测试它们,但即使你已经找到了将它们粘在一起的方法,它也会是因all those caveats而混乱。你必须等待JDK8,以便至少可以远程读取它。
另一件事是你正在测试成对的Blah
s(名称为+1),这对于通用库来说实在太远了。想象一下像这样无数的方法。
最后一件事是你正在做的事情并不是真正有用的:你的条件取决于filteredBlahs
列表,它在迭代期间会发生变化。这很好,如果你需要它,但将其转换为功能上看起来的东西将是一种混淆。
用于过滤的谓词实际上不应该在过程中发生变化,否则您可以在this issue中运行未定义或混乱的行为。