Google Guava - 如果元素的属性相对于另一个元素,则使用值1过滤集合

时间:2014-01-30 14:06:58

标签: java guava jodatime

这里我的第一个问题的标题真的很差,但希望我仍能得到答案!

我希望能够将以下代码段中的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将使流程更容易理解。

我非常欢迎任何有关如何改进问题或澄清问题的反馈意见!

1 个答案:

答案 0 :(得分:3)

NO。

详细说明:你可以写Function来提取日期,你可以写Predicates来测试它们,但即使你已经找到了将它们粘在一起的方法,它也会是因all those caveats而混乱。你必须等待JDK8,以便至少可以远程读取它。

另一件事是你正在测试成对的Blah s(名称为+1),这对于通用库来说实在太远了。想象一下像这样无数的方法。

最后一件事是你正在做的事情并不是真正有用的:你的条件取决于filteredBlahs列表,它在迭代期间会发生变化。这很好,如果你需要它,但将其转换为功能上看起来的东西将是一种混淆。

用于过滤的谓词实际上不应该在过程中发生变化,否则您可以在this issue中运行未定义或混乱的行为。