Java 8实战-StreamVS传统for-each性能
1、Stream流式操作天然多线程(parallelStream),以下小数据量结果测验stream/parallelStream性能类似,说明stream小数据量场景性能不如foreach
2、流式数据重复消费,抛出illegalStateException:stream already upon or closed
实践代码如下:
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class TestStreamSpeed
{
public static void main(String[] args)
{
Set<String> aSet = new HashSet<String>();
for (int i = 0; i < 100000; i++)
{
aSet.add(i % 2 == 0 ? String.valueOf(i) : String.valueOf(i) + " ");
}
long current1 = System.currentTimeMillis();
// 并行处理 parallelStream()
Stream<String> s = aSet.parallelStream();
s.filter(str -> str != null).map(String::trim)
.filter(str -> str.length() > 0)
// ====依然返回stream的是中间操作====
// .distinct() 去重
// .limit(3) // 取前三个
// 包括sorted/map等
// ====返回其他类型的时终结操作====
// .count()
// .forEach()
.collect(Collectors.toSet());
// 分组
// collect(Collectors.groupingBy(String::length))
System.out.println(
"stream foreach --> " + (System.currentTimeMillis() - current1));
long current2 = System.currentTimeMillis();
Set<String> cSet = new HashSet<String>();
for (String a : aSet)
{
if (a != null)
{
String trimStr = a.trim();
if (trimStr.length() > 0)
{
cSet.add(trimStr);
}
}
}
System.out.println(
"set foreach --> " + (System.currentTimeMillis() - current2));
// 流只能被消费一次 重复消费报错
s.filter(String::isEmpty);
}
}
输出:
stream foreach --> 117
set foreach --> 34
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
at java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:94)
at java.util.stream.ReferencePipeline$StatelessOp.<init>(ReferencePipeline.java:618)
at java.util.stream.ReferencePipeline$2.<init>(ReferencePipeline.java:163)
at java.util.stream.ReferencePipeline.filter(ReferencePipeline.java:162)
at com.huawei.crystal.test.TestStreamSpeed.main(TestStreamSpeed.java:54)
参考书籍:
《Java 8实战》
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
https://blog.csdn.net/zangdaiyang1991/article/details/83823616
Java 8实战阅读-StreamVS传统for-each性能(续)