在{8}中,特别是SortedSet
,在Java 8及更高版本中,有一种更有效的方法来识别最首元素的合格子集(“TreeSet
” )元素?
想象一下Person
成员birthDate
个对象。我们想要排除未成年人,只留下我们的SortedSet中的成年人。
或者说,从技术角度讲......我有一组对象,其自然排序(headSet compareTo
方法)基于日期时间值(Comparable
{{ 3}}对象,或者它可以是Joda-Time DateTime
)。我想删除具有“java.time”的旧元素,这意味着它们的日期时间值现在小于我想要的日期时间。
我想利用元素已经排序的事实。因此,在ZonedDateTime
中使用带有aged-out的Predicate效率不高,因为它会比较 all SortedSet中的元素。鉴于排序顺序,在找到第一个不匹配后无需继续比较。
我想我可以自己编写一个循环来查找和删除,但这似乎可以构建到Collections框架中。
DateTime minimumBirthDateTime = DateTime.now().minusYears( 18 );
SortedSet<Person> persons = … ;
while ( persons.pollFirst() != null ) {
Person p = persons.first();
if( p.getBirthDate().isBefore( minimumBirthDateTime ) ) {
persons.remove( p ); // Remove minors from our SortedSet, leaving only adults.
}
}
一种解决方法:虚拟对象。
构造一个假的Person
对象,其中包含我们想要比较的最小出生日期时间。然后我们可以使用removeIf
实现的Stream接口的漂亮方法。
另一种解决方法:伪子类,虚拟对象。
假设Person
类的构造过于复杂,无法构建虚拟实例。创建Person
的子类,其名称类似于Person_FakeForSortedSetComparing
。为了这个特殊目的,给该子类一个构造函数。在此示例中,为最小出生日期传递DateTime对象。
Person_FakeForSortedSetComparing youngestPossibleAdult = new Person_FakeForSortedSetComparing( minimumBirthDateTime );
SortedSet<Person> minors = persons.headSet( youngestPossibleAdult );
persons.removeAll( minors );