java更高级版本的集合。频率()
那么,让我们假设我有以下列表:
List<Foo> myList = getListFromSomePlace();
int frequency = Collections.frequency(myList, someFoo);
这将统计所有someFoo
匹配元素
但是,如果我有一个更“复杂”的版本:
List<Foo> myList = getListFromSomePlace();
int frequency = /* get number of Elements in the List whose getInternalFoo() match a certain value */
一种方法是重写Foo类中的equals
方法,但我确实希望避免在Foo类中放置自定义行为,特别是因为我可能希望根据Foo类的不同属性获取频率,并且我只能有一个版本的被重写的equals
方法
像Collections.sort
这样的函数将允许我传递一个定制的比较器,该比较器将完全满足我的需要,但不支持集合。频率不能提供这一点
对于Java8,我将使用一个流和一些Lambda表达式来解决这个问题,但我想看看是否有一个简单的解决方案可以用于Java7。我正在寻找的东西,不涉及编码自定义频率方法自己,但使用一些现有的API。有什么事吗
# 1 楼答案
我认为你不能避免写你自己的方法。如果你不想污染你的API,就把它私有化
# 2 楼答案
根据您的要求,只需通过覆盖
equals()
来“装饰”您的someFoo
:现在,这是因为
Collections.frequency()
实现检查对象参数equals()
是否是列表中的每个元素,而不是相反。如果后者为真,则返回频率将始终为0
正如您提到的,您“可能希望根据Foo类的不同属性获取频率”,您可以将匿名内部类的
equals()
方法的第一部分移动到通用抽象类:然后,创建
ComplexFrequency
的子类,根据需要进行比较:最后,使用此子类“装饰”您的
someFoo
,并将“装饰”实例传递给Collections.frequency()
:# 3 楼答案
我不认为标准JDK提供了这一点(Java<;=7)。如果您想要一个与Java7一起工作且不涉及编码的解决方案,那么可以使用Guava及其^{} 方法
看起来是这样的:
如果您仍然认为不值得为此添加第三方库,那么您仍然可以编写自己的函数接口,以及一个实用程序类,该类提供了一个方法,可以将
List<T>
转换为List<U>
并提供要应用的映射。这并不难,也不需要那么多行代码编写自己的实现将允许您一次性完成这项工作