有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用现有列表的成员变量创建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循环吗

非常感谢您的任何意见,对我的无知表示歉意


共 (4) 个答案

  1. # 1 楼答案

    为了从“myclass”中提取一个字段,必须循环遍历列表的全部内容。无论是使用for循环还是使用某种对您隐藏for循环的构造,都需要大约相同的时间和使用相同的资源量

  2. # 2 楼答案

    不知道你说的高效是什么意思。正如其他人所说,必须以某种方式对该列表的每个元素调用getGoodInteger方法。最好不要每次都检查size

    List<Integer> goodInts = new ArrayList<Integer>();
    for (MyClass myObj : myList) {
       goodInts.add(myObj.getGoodInteger());
    }
    

    我还支持jboxer提出的为此目的创建函数的建议

  3. # 3 楼答案

    实际上,我能想到的只有两种方法可以让这更“有效”:

    1. 以某种方式将其在多个内核之间拆分,以便并行工作。当然,这是假设你有其他的内核,它们已经没有做任何有用的事情,而且有足够的处理在进行,这样做的无意中听到的甚至是值得的。我的猜测是(至少)最后一点在你的情况下是不正确的,因为你只是在说一个有成就的人。如果你想这样做,你可以尝试让线程的数量(我可能会使用一个执行器和未来)与内核的数量相等,然后给每个线程提供大致相同的工作量(可能只是把列表切成大致相同大小的部分)

    2. 如果你相信你只会访问结果列表的一小部分,但不确定具体是哪些元素,你可以试着懒洋洋地做一些事情。最简单的方法是使用预先构建的惰性映射列表实现。有一个在Google Collections Library。你可以通过调用Lists.transform()来使用它。它会立即返回一个列表,但它只会在元素被请求时对它们执行转换。同样,如果你只查看了输出列表中的一小部分,那么这只会更有效。如果你最后看了整件事,效率不会提高,而且可能会降低效率

  4. # 4 楼答案

    一个重要的问题是:你为什么要这样做?你想让你的代码更干净吗?如果是这样的话,您可以按照以下思路编写一个方法:

    public static List<Integer> extractGoodInts (List<myClass> myList) {
        List<Integer> goodInts = new ArrayList<Integer>();
    
        for(int i = 0; i < myList.size(); i++){
            goodInts.add(myList.get(i).getGoodInteger());
        }
    
        return goodInts;
    }
    

    然后,在你的代码中,你可以:

    List<myClass> myList = myClass.selectFromDB("where clause");
    List<Integer> goodInts   = myClass.extractGoodInts(myList);
    

    然而,如果你想让你的代码更有效率,却不允许你更改查询,那你就倒霉了;无论如何,你需要从列表中单独获取每个int,这意味着无论你能想出什么聪明的技巧,你都将在O(n)时间内运行