如何使用现有列表的成员变量创建java列表,而不使用for循环?

如何使用现有列表的成员变量创建java列表,而不使用for循环?,java,list,collections,Java,List,Collections,我有一个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.

我有一个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循环吗


非常感谢您的任何输入,抱歉我的无知。

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

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

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

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,这意味着无论你能想出什么聪明的窍门,你都会准时到达

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

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,这意味着无论你能想出什么聪明的窍门,你都会准时到达

我认为只有两种方法可以提高效率:

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

如果您相信您将只访问结果列表的一小部分,但不确定具体是哪些元素,那么您可以尝试惰性地进行操作。最简单的方法是使用预构建的惰性映射列表实现。里面有一个。你通过打电话来使用它。它将立即返回一个列表,但它只在元素被请求时对其执行转换。同样,如果您只查看了输出列表中的一小部分,那么这只会更有效。如果你最后看了整件事,这将不会更有效率,而且可能会降低效率


我认为只有两种方法可以提高效率:

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

如果您相信您将只访问结果列表的一小部分,但不确定具体是哪些元素,那么您可以尝试惰性地进行操作。最简单的方法是使用预构建的惰性映射列表实现。里面有一个。你通过打电话来使用它。它将立即返回一个列表,但它只在元素被请求时对其执行转换。同样,如果您只查看了输出列表中的一小部分,那么这只会更有效。如果你最后看了整件事,这将不会更有效率,而且可能会降低效率


不知道你说的高效是什么意思。另一个 也就是说,您必须以某种方式对该列表的每个元素调用getGoodInteger方法。最好不要每次都检查尺寸:

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

我还支持jboxer关于为此目的创建函数的建议

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

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

我还支持jboxer关于为此目的创建函数的建议

您无法在Javascript中创建列表。请注意,此方法是静态的,它指出了一个潜在的设计缺陷。它实际上应该是包装列表的类的成员方法。这样做,你就有了一个真正的OO设计的开始…唐:关于int的东西,这是一个很好的呼吁。我已经有一段时间没有使用Java了。比尔·K:同意,不过对于这样的事情来说,把清单包装起来可能有点过头了。我同意你的观点,OO设计可以更干净,但我可能会认为这是不必要的复杂性,只有当我们最终对其他类型的double、string等和其他表重复此代码时,才应该像这样进行重构。你不能用Java创建列表。还请注意,此方法是静态的,指出了潜在的设计缺陷。它实际上应该是包装列表的类的成员方法。这样做,你就有了一个真正的OO设计的开始…唐:关于int的东西,这是一个很好的呼吁。我已经有一段时间没有使用Java了。比尔·K:同意,不过对于这样的事情来说,把清单包装起来可能有点过头了。我同意你的观点,OO设计可以更简洁,但我可能会说这是不必要的复杂性,只有当我们最终对其他类型的double、string等和其他表重复这段代码时,才应该进行重构。你不能用Java创建列表,你不能用Java创建列表