我最近在我的应用程序中遇到了一个大量使用集合和列表的模块。是的它用Java。因此,无论是出于性能原因还是作者使用列表而且在很多地方都有地图。他对它进行常规操作,比如删除一些元素,添加,更新列表以及每次执行此操作时,都会通过遍历整个列表来完成。有时候列表的范围是10,000个元素。
现在我的问题是为什么没有语言功能可以促进这项操作?我的意思是为什么我们不能有一些可以在列表和集合上执行的基本SQL?有没有这种功能的语言?
P.S:嗯,我不确定这是否有点主观,反对SO规则。但我很想在这里问这个问题。也许管理员可以把它放在正确的位置。所以这里。答案 0 :(得分:6)
与Google Collections一起,我建议您查看LambdaJ:
List<Person> sortedByAgePersons = new ArrayList<Person>(persons);
Collections.sort(sortedByAgePersons, new Comparator<Person>() {
public int compare(Person p1, Person p2) {
return Integer.valueOf(p1.getAge()).compareTo(p2.getAge());
}
});
变为
List<Person> sortedByAgePersons = sort(persons, on(Person.class).getAge());
很多整洁的排序,过滤和列表操作功能。
答案 1 :(得分:4)
Google Collections中有一些功能风格的方法,特别是Collections2
,Iterables
和Maps
。
但由于(7之前的)Java中缺少闭包或紧凑的内部类语法,使用它们会变得非常冗长。
答案 2 :(得分:0)
我读了LambdaJ上面提到的例子。它确实缩短了代码,但我不确定这是否会自动表示性能的提高。 Java有很多数据结构可供选择,看起来你的开发人员使用不同的数据结构是有原因的。曾经有一些情况下,现有的数据结构和排序算法对于您拥有的数据类型没有意义,并且出于性能原因我使用了自己的算法。那是几年前的事了。除非您的应用程序使用Java的有限子集,例如移动sdk,否则标准Java提供了足够多种集合供您选择,并且您可以在不影响性能的情况下找到满足您需求的集合。
答案 3 :(得分:0)
这里的关键考虑因素是List是否是一个合适的集合类型。如果想要对具有相同名字的每个人进行一些操作是很常见的,那么相应地组织数据 - 例如在Multimap<String, Whatever>
中,其中键是名字。 (Multimap来自Google Collections。)
答案 4 :(得分:-1)
LINQ可能是您正在寻找的功能,但我不知道Java的功能。
答案 5 :(得分:-1)
当Java被发明时,它没有迭代器和集合实用程序。这个想法还不存在。你唯一拥有的是Enumeration
感到笨拙,特别是没有实用功能。
使用Java 1.2,添加了迭代器和集合。这是一个很大的改进,但从今天的角度来看,它留下了很大的改进空间。
要填补空白,请查看语言级别Groovy的excellent support for collections或使用commons collections等辅助框架。
[编辑]如果代码使用ArrayList
,那么遍历列表非常便宜(就像插入和删除一样令人惊讶;今天的计算机真的很快就能复制内存)。