stream与for循环性能问题

在翻看运维系统时,引发的思考,下图的代码换成for循环在性能方面是否会好一些?

img

自己写的测试代码,但是不知道是否具有代表性

@Test
    public void groupList() {
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < 10000000; i++) {
            integers.add(1);
            integers.add(2);
            integers.add(3);
            integers.add(4);
            integers.add(5);
            integers.add(6);
            integers.add(6);
        }
        System.out.println("集合大小------------>"+integers.size());
//-----------------------------------------------------------------------------
        long l3 = System.currentTimeMillis();
        ArrayList<Integer> integers1 = new ArrayList<>();
        for (int i = 0; i < integers.size(); i++) {
        if (integers.get(i)>0){integers1.add(integers.get(i));}}
        long l4 = System.currentTimeMillis();
        System.out.println("普通for用时:"+(l4-l3));
        System.out.println("普通for大小:"+integers1.size());
//-----------------------------------------------------------------------------
        long l5 = System.currentTimeMillis();
        ArrayList<Integer> integers2 = new ArrayList<>();
        for (Integer integer : integers) {
        if (integer>0){integers2.add(integer);}}
        long l6 = System.currentTimeMillis();
        System.out.println("增强for用时:"+(l6-l5));
        System.out.println("增强for大小:"+integers2.size());
//-----------------------------------------------------------------------------
        long l1 = System.currentTimeMillis();
        List<Integer> collect = integers.stream().filter(x -> x > 0).collect(Collectors.toList());
        long l2 = System.currentTimeMillis();
        System.out.println("stream.filter用时:"+(l2-l1));
        System.out.println("stream.filter大小:"+collect.size());
//-----------------------------------------------------------------------------
        long l7 = System.currentTimeMillis();
        List<Integer> collect2 = integers.stream().map(x -> (x > 0) ? x : 1).collect(Collectors.toList());
        long l8 = System.currentTimeMillis();
        System.out.println("stream.map用时:"+(l8-l7));
        System.out.println("stream.map大小:"+collect2.size());
    }

结果如下:

集合大小------------>70000000
普通for用时:12172
普通for大小:70000000
增强for用时:812
增强for大小:70000000
stream.filter用时:21988
stream.filter大小:70000000
stream.map用时:3724
stream.map大小:70000000
我想问下各位,在什么情况下,stream会比for循环的效率高(不考虑代码的整洁性)

Stream可以用并行流,在大量数据的时候,性能都是远超for和foreach