Java Stream 优化java代码

使用strteam就是为了代码更加简洁,同时功能 又不会收到影响,废话不多说

使用原始流

使用 int、long 和 double 等基本类型时,请使用IntStream、LongStream 和 DoubleStream 等基本流,而不是 Integer、Long 和 Double 等装箱类型流。原始流可以通过避免装箱和拆箱的成本来提供更好的性能

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.java.file.operater;
 
import org.junit.Test;
 
import java.util.stream.IntStream;
 
/**
 * @Description:
 * @Author: 喵星人
 * @Create: 2023/10/12 18:23
 */
 
public class StreamTest {
 
    @Test
    public void test(){
        int[] array = new int[]{1, 2, 3, 4, 5};
        IntStream intStream = IntStream.of(array);
        intStream.forEach(a->{
            System.out.println(a);
        });
 
    }
}

  

嵌套流

最佳实践是避免嵌套流,因为它可能导致代码难以阅读和理解。相反,尝试将问题分解为更小的部分,并使用中间集合或局部变量来存储中间结果

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.java.file.operater;
 
import org.junit.Test;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
 
/**
 * @Description:
 * @Author: 喵星人
 * @Create: 2023/10/12 18:23
 */
 
public class StreamTest {
 
    @Test
    public void test(){
        List<String> list1 = Arrays.asList("apple", "banana", "cherry");
        List<String> list2 = Arrays.asList("orange", "pineapple", "mango");
        List<String> list3 = Arrays.asList("orange1", "pineapple1", "mango1","orange1", "pineapple1", "mango1");
        List<String> list4 = Arrays.asList("orange2", "pineapple2", "mango2","orange2", "pineapple2", "mango2");
 
        List<String> stringList = Stream.concat(list1.stream(), list4.stream())
                .filter(s -> s.toString().length() > 6)
                .collect(Collectors.toList());
        stringList.forEach(a->{
            System.out.println(a);
        });
         
    }
}

  

使用并行流

并行虽然很快吗,但是顺序没法保证,常规的情况的很多问题都会在这里暴露出来,可以类比高并发思考

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.java.file.operater;
 
import org.junit.Test;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
 
/**
 * @Description:
 * @Author: 喵星人
 * @Create: 2023/10/12 18:23
 */
 
public class StreamTest {
 
    @Test
    public void test(){
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
        /**
         * 使用reduce求和,reduce方法接受两个参数:一个初始值(在这里是0),
         * 和一个二元操作符(在这里是Integer::sum)。Integer::sum是一个方法引用,
         * 它调用Integer类的sum方法来计算两个整数的和。
         * reduce方法将流中的所有元素结合在一起(在这里是通过求和),并返回结果
         */
        Integer reduce = integerList.parallelStream().reduce(0, Integer::sum);
        System.out.println(reduce);
    }
}

  

使用惰性求值以获得更好的性能

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.java.file.operater;
 
import org.junit.Test;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
 
/**
 * @Description:
 * @Author: 喵星人
 * @Create: 2023/10/12 18:23
 */
 
public class StreamTest {
 
    @Test
    public void test(){
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        Optional<Integer> integer = list.stream()
                /**
                 * 代码中的filter方法就是一个惰性操作。它不会立即执行,而是创建了一个新的流,
                 * 该流包含了应用过滤操作的逻辑。只有当一个非惰性操作(例如findFirst)被调用时,所有的惰性操作才会被实际执行
                 */
                .filter(n -> n > 3)
                /**
                 * 由于findFirst方法,一旦找到第一个大于3的元素,过滤操作就会停止,
                 * 而不是继续处理列表中的所有元素。这可以减少不必要的计算,从而提高性能
                 * findFirst是一个短路操作,意味着它不需要处理整个流就可以产生结果
                 */
                .findFirst();
        System.out.println(integer.get());
 
    }
}

  

在map()之前使用filter()以避免不必要的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.java.file.operater;
 
import org.bouncycastle.tsp.TSPUtil;
import org.junit.Test;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
 
/**
 * @Description:
 * @Author: 喵星人
 * @Create: 2023/10/12 18:23
 */
 
public class StreamTest {
 
    @Test
    public void test(){
        List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list = integerList.stream()
                .filter(i -> i % 2 == 0)
                .map(i -> i * 2)
                .collect(Collectors.toList());
        for (Integer integer : list) {
            System.out.println(integer);
        }
 
    }
}

  

使用distinct()删除重复项

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.java.file.operater;
 
import org.bouncycastle.tsp.TSPUtil;
import org.junit.Test;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
 
/**
 * @Description:
 * @Author: 喵星人
 * @Create: 2023/10/12 18:23
 */
 
public class StreamTest {
 
    @Test
    public void test(){
        List<Integer> integerList = Arrays.asList(1, 2, 3, 3, 4, 5, 5);
        List<Integer> list = integerList.stream()
                .distinct()
                .collect(Collectors.toList());
        list.forEach(a->{
            System.out.println(a);
        });
 
    }
}

  

谨慎使用sorted()

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.java.file.operater;
 
import org.bouncycastle.tsp.TSPUtil;
import org.junit.Test;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
 
/**
 * @Description:
 * @Author: 喵星人
 * @Create: 2023/10/12 18:23
 */
 
public class StreamTest {
 
    @Test
    public void test(){
        List<Integer> integerList = Arrays.asList(34, 3, 1, 89, 2, 10000, 998, 77);
        List<Integer> list = integerList.stream()
                .sorted()
                .collect(Collectors.toList());
        list.forEach(a->{
            System.out.println(a);
        });
 
 
    }
}

  来源:medium.com/javarevisited/10-java-stream-tips-must-read-2063a84af3be

 

posted @   不忘初心2021  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
历史上的今天:
2022-10-12 java.security.InvalidKeyException: Illegal key size or default parameters
点击右上角即可分享
微信分享提示