Stream流是Java8中提供的一个重要新特性,它允许开发人员以声明方式处理集合。其中parallelStream其实就是一个并行执行的流,它通过默认的ForkJoinPool,可能提高你的多线程任务的速度。
Stream流特点如下
Stream流接口中定义了许多对于集合的操作方法,主要分为两类:中间操作和终端操作。
常见的中间操作方法有:limit、skip、distinct、sorted等。
常见的终端操作方法有:forEach、count、toArray、reduce等。
常见的收集操作方法有:collect。
使用Stream流的方式操作完毕后,通过收集方法collect将数据收集到集合中,工具类Collectors提供了具体的收集方式,如下
Stream性能
下面分别对for循环、foreach循环、stream.foreach循环、parallelStream.foreach循环的性能进行测试
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
Long startTime = System.currentTimeMillis();
forMethod(list);
Long endTime = System.currentTimeMillis();
System.out.println("result:" + (endTime - startTime));//29 15 31 15 16
}
private static void forMethod(List<Integer> list) {
for (Integer i : list) {
System.out.println("------" + i);
}
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
Long startTime = System.currentTimeMillis();
foreachMethod(list);
Long endTime = System.currentTimeMillis();
System.out.println("result:" + (endTime - startTime));//85 80 84 84 85
}
private static void foreachMethod(List<Integer> list) {
list.forEach(integer -> {
System.out.println("------" + integer);
});
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
Long startTime = System.currentTimeMillis();
streamMethod(list);
Long endTime = System.currentTimeMillis();
System.out.println("result:" + (endTime - startTime));//116 115 85 84 84
}
private static void streamMethod(List<Integer> list) {
list.stream().forEach(integer -> {
System.out.println("------" + integer);
});
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
Long startTime = System.currentTimeMillis();
parallelStreamMethod(list);
Long endTime = System.currentTimeMillis();
System.out.println("result:" + (endTime - startTime)); //179 138 140 122 175
}
private static void parallelStreamMethod(List<Integer> list) {
list.parallelStream().forEach(integer -> {
System.out.println("------" + integer);
});
}
在数据量为1000时,效率依次是for>foreach>stream.foreach>parallelStream.foreach。
理论上,数据量越大,stream的效率越高,parallelStream的效率会最高且是并行处理。但选用需思考其场景,避免数据安全问题。