Java 8实战-StreamVS传统for-each性能

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 aSet = new HashSet();
        for (int i = 0; i < 100000; i++)
        {
            aSet.add(i % 2 == 0 ? String.valueOf(i) : String.valueOf(i) + " ");
        }
        long current1 = System.currentTimeMillis();
        // 并行处理 parallelStream()
        Stream 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 cSet = new HashSet();
        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.(AbstractPipeline.java:203)
    at java.util.stream.ReferencePipeline.(ReferencePipeline.java:94)
    at java.util.stream.ReferencePipeline$StatelessOp.(ReferencePipeline.java:618)
    at java.util.stream.ReferencePipeline$2.(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性能(续)

你可能感兴趣的:(Java8)