目录
- 前言
- 1. 基本知识
- 2. Demo
前言
事情起因是遍历大数据的时候,数据卡顿很严重
对于Java的基本知识推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
1. 基本知识
在Java中,Stream API提供了一种功能强大且灵活的方式来处理集合数据
与传统的for循环相比,Stream API具有许多优势,但也存在一些差异和限制
一、Stream遍历
优势:
- 函数式编程:Stream API提供了丰富的函数式编程操作,如map、filter、reduce等,可以更加清晰和简洁地表达数据处理逻辑
- 并行处理:Stream API支持并行处理,可以自动利用多核处理器的优势,加速数据处理过程
- 延迟执行:Stream操作可以延迟执行,只有在终止操作调用时才会实际执行,这有助于提高性能和资源利用率
劣势:
- 学习曲线:相对于传统的for循环,Stream API需要一定的学习曲线,特别是对于初学者来说
- 性能开销:在一些简单的情况下,使用Stream API可能会引入一些性能开销,特别是对于小规模数据集
应用场合:
- 数据集合操作:对集合进行过滤、转换、排序等操作时,Stream API可以提供简洁的解决方案。
- 大规模数据处理:对于大规模数据集合,尤其是需要并行处理的场景,Stream API可以发挥其优势。
二、For循环遍历
优势:
- 简单直观:for循环是一种传统的迭代方式,简单直观,易于理解和掌握
- 性能较好:在一些简单的场景下,for循环可能具有更好的性能,尤其是对于小规模数据集合
劣势:
- 可读性较差:相比于Stream API,使用for循环可能需要更多的代码量,并且代码结构可能相对复杂,可读性较差
- 并行处理困难:对于需要并行处理的场景,使用传统的for循环可能需要自行管理线程池等复杂逻辑
通过以上的差异之处,主要就是代码美观度以及数据量的大小来选择
影响数据量大小的因素
无论是使用Stream API还是传统的for循环,其性能在很大程度上取决于数据集合的大小
一般而言,对于小规模数据集合,两者的性能差异可能不明显,但随着数据量的增加,Stream API的优势会更加显著,尤其是在并行处理大规模数据集合时,但这个不是很绝对!!!
一切优化一定要结合自身的数据量以及对数据量的操作难易,在做出选择哪个进行迭代
一切优化一定要结合自身的数据量以及对数据量的操作难易,在做出选择哪个进行迭代
一切优化一定要结合自身的数据量以及对数据量的操作难易,在做出选择哪个进行迭代
2. Demo
基本知识Demo回顾:
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 使用Stream API计算偶数的平方和
int sumOfEvenSquaresStream = numbers.stream()
.filter(n -> n % 2 == 0)
.mapToInt(n -> n * n)
.sum();
System.out.println("Sum of squares of even numbers using Stream: " + sumOfEvenSquaresStream);
// 使用传统的for循环计算偶数的平方和
int sumOfEvenSquaresForLoop = 0;
for (int number : numbers) {
if (number % 2 == 0) {
sumOfEvenSquaresForLoop += number * number;
}
}
System.out.println("Sum of squares of even numbers using for loop: " + sumOfEvenSquaresForLoop);
}
}
以上Demo并非是比较差异,只是回顾总结,毕竟实战场合不一样,重点还是要结合自身,判断其数据迭代的快慢
观测迭代时间变化的Demo:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 创建一个包含大量数据的List
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
numbers.add(i);
}
// 使用Stream API进行遍历和计时
long startTimeStream = System.currentTimeMillis();
numbers.stream().forEach(number -> {
// 在这里可以执行一些操作
});
long endTimeStream = System.currentTimeMillis();
long elapsedTimeStream = endTimeStream - startTimeStream;
System.out.println("Time taken with Stream API: " + elapsedTimeStream + " milliseconds");
// 使用传统的for循环进行遍历和计时
long startTimeForLoop = System.currentTimeMillis();
for (int number : numbers) {
// 在这里可以执行一些操作
}
long endTimeForLoop = System.currentTimeMillis();
long elapsedTimeForLoop = endTimeForLoop - startTimeForLoop;
System.out.println("Time taken with for loop: " + elapsedTimeForLoop + " milliseconds");
}
}
截图如下:
通过上面的代码可看出,此处的处理过程使用for是比较快的!
这也后续验证了我在操作某个数据时,转为for来遍历(一定要结合自身数据以及操作):