我在java中创建了一个包含10个数字的整数列表。我想得到列表中数字的总和。为此,我使用了四种方法迭代列表并返回总和。代码为同样如下。
public static void main(String[] args) {
List<Integer> numbers=Arrays.asList(1,5,10,25,30,17,3,9,11,26);
//Using simple for loop for finding sum of numbers in the list
System.out.println(sumOfNumbersUsingSimpleForLoop(numbers));
//Using listIterator interface for finding sum of numbers in the list
System.out.println(sumOfNumbersUsingIterableInterface(numbers));
//Using enhanced for loop for finding sum of numbers in the list
System.out.println(sumOfNumbersUsingEnhancedForLoop(numbers));
//Using lambda expression for finding sum of numbers in the list
System.out.println(sumOfNumbersUsingLambdaExpression(numbers));
}
public static int sumOfNumbersUsingSimpleForLoop(List<Integer> numbers)
{
int sum=0;
for(int i=0;i<numbers.size();i++)
{
sum=sum+numbers.get(i);
}
return sum;
}
public static int sumOfNumbersUsingIterableInterface(List<Integer> numbers)
{
int sum=0;
ListIterator<Integer> iterator=numbers.listIterator();
while(iterator.hasNext())
{
sum=sum+iterator.next();
}
return sum;
}
public static int sumOfNumbersUsingEnhancedForLoop(List<Integer> numbers)
{
int sum=0;
for(int number:numbers)
{
sum=sum+number;
}
return sum;
}
public static int sumOfNumbersUsingLambdaExpression(List<Integer> numbers)
{
return numbers.stream().parallel().reduce(0, (e,num)->e+num);
}
所有这些方法都返回137作为结果。对于我来说,使用lambda表达式来计算总和是很方便的。但是如果列表的大小变得很高,我不确定它的性能。这将是非常有用的如果有人可以说明所有方法的性能比较。
答案 0 :(得分:2)
在您的情况下,顺序流不能比for循环更快(流也将循环遍历列表,但有一些开销)。 for循环应该是等效的。
甚至更多的情况是你的流示例比for循环版本引发了更多的装箱/拆箱操作。您可以通过以下方式改进:
return numbers.parallelStream().mapToInt(Integer::intValue).sum();
如果列表很大,并行流可能会更快(我的猜测是:高于10k +元素 - 低于并行化的开销可能太高)。
如果你真的需要表现,你应该使用原语......
答案 1 :(得分:1)
lambda示例中可能遇到的唯一假设性能问题是它并行化。这导致JVM启动一些具有固有开销成本的线程,加上显然的通信成本。也就是说,如果你同时处理十亿个整数,那么在大多数情况下,并行化版本可能会运行得更快。如果你试图运行它会有性能问题很多因为缺少内核和物理CPU。您可以使用单线程示例更轻松地预测成本,但只要它不被多次调用(例如通过真正常用的REST API),它就会在大型列表上运行得更快。