我的老师确信在循环列表时使用流是很方便的,因为操作可以并行化。
我知道在某些方面这是正确的,但我认为我们总能实现更快的代码来自己编写。
我们在这里谈论的是我们希望尽可能优化的用例。
假设我们从以下代码开始:
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
public class HelloWorld{
public static void main (String args[]) {
List<Something> ls = new ArrayList<Something>();
ls.add(new Something(true));
ls.add(new Something(false));
System.out.println("Active things: " + getActive(ls).size());
}
public static List<Something> getActive(List<Something> listOfThings){
return listOfThings != null? listOfThings.stream().filter(t -> t.isActive()).collect(Collectors.toList()): null;
}
public static class Something {
public Something(boolean active) {
this.active = active;
}
private boolean active;
public boolean isActive() {
return active;
}
public void justDoIt() {
System.out.println("done");
}
}
}
是不是真的,方法getActive()可以优化,避免使用流?
我知道使用流更容易,但因为它们必须是通用的,所以它们永远不会比编写良好的优化代码更快。
例如,如果列表非常大并且我们知道在三个内核上并行化循环会很方便,那么我们不能在三个不同的线程中执行带有标准迭代器的循环吗?