如何使用现有列表的成员变量创建java列表,而不使用for循环?
我有一个java列表
List<myclass> myList = myClass.selectFromDB("where clause");
//myClass.selectFromDB returns a list of objects from DB
但我想要一个不同的清单,特别是
List<Integer> goodList = new ArrayList<Integer>();
for(int i = 0;i++; i<= myList.size()) {
goodList[i] = myList[i].getGoodInteger();
}
是的,我可以在最初创建myList时执行与DB不同的查询,但是现在假设我必须使用它作为起点,而不使用其他DB查询。我可以用更有效的方法来代替for循环吗
非常感谢您的任何意见,对我的无知表示歉意
# 1 楼答案
为了从“myclass”中提取一个字段,必须循环遍历列表的全部内容。无论是使用for循环还是使用某种对您隐藏for循环的构造,都需要大约相同的时间和使用相同的资源量
# 2 楼答案
不知道你说的高效是什么意思。正如其他人所说,必须以某种方式对该列表的每个元素调用
getGoodInteger
方法。最好不要每次都检查size
:我还支持jboxer提出的为此目的创建函数的建议
# 3 楼答案
实际上,我能想到的只有两种方法可以让这更“有效”:
以某种方式将其在多个内核之间拆分,以便并行工作。当然,这是假设你有其他的内核,它们已经没有做任何有用的事情,而且有足够的处理在进行,这样做的无意中听到的甚至是值得的。我的猜测是(至少)最后一点在你的情况下是不正确的,因为你只是在说一个有成就的人。如果你想这样做,你可以尝试让线程的数量(我可能会使用一个执行器和未来)与内核的数量相等,然后给每个线程提供大致相同的工作量(可能只是把列表切成大致相同大小的部分)
如果你相信你只会访问结果列表的一小部分,但不确定具体是哪些元素,你可以试着懒洋洋地做一些事情。最简单的方法是使用预先构建的惰性映射列表实现。有一个在Google Collections Library。你可以通过调用Lists.transform()来使用它。它会立即返回一个列表,但它只会在元素被请求时对它们执行转换。同样,如果你只查看了输出列表中的一小部分,那么这只会更有效。如果你最后看了整件事,效率不会提高,而且可能会降低效率
# 4 楼答案
一个重要的问题是:你为什么要这样做?你想让你的代码更干净吗?如果是这样的话,您可以按照以下思路编写一个方法:
然后,在你的代码中,你可以:
然而,如果你想让你的代码更有效率,却不允许你更改查询,那你就倒霉了;无论如何,你需要从列表中单独获取每个int,这意味着无论你能想出什么聪明的技巧,你都将在O(n)时间内运行