首页 > 编程语言 >Java Stream 优化java代码

Java Stream 优化java代码

时间:2023-10-12 19:23:41浏览次数:35  
标签:java Stream stream Arrays List util import Java

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

使用原始流

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

 

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);
        });

    }
}

  

嵌套流

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

 

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);
        });
        
    }
}

  

使用并行流

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

 

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);
    }
}

  

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

 

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()以避免不必要的处理

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()删除重复项

 

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()

 

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

 

标签:java,Stream,stream,Arrays,List,util,import,Java
From: https://www.cnblogs.com/q202105271618/p/17760337.html

相关文章

  • java数据库与JDBC
    java数据库与JDBCjava与MYSQL1.下载驱动https://dev.mysql.com/downloads/connector/j/https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-j-8.1.0.zip2.导入mysql-connector-j.*.jar包3.然后在src目录下新建一个java类4.写入数据库连接测试代码import......
  • java10/12今日总结
    1publicclassZoo2{34publicstaticvoidmain(Stringargs[])5{67Feederf=newFeeder("小李");89//饲养员小李喂养一只狮子1011f.feedLion(newLion());1213//饲养员小李喂养十......
  • Java8新特性之Stream流(六)
    1.Stream流介绍一种支持顺序和并行聚合操作的元素序列,能够对集合、数组进行过滤、排序、去重等操作;Stream流与日常IO流是不同的技术体系;官方定义:Asequenceofelementssupportingsequentialandparallelaggregateoperations.Stream的两种操作:publicclassStreamTes......
  • Java8新特性之重复注解和类型注解(五)
    1.重复注解介绍Java8中引入的一个新注解@Repeatable,该注解只能标记在其他注解上,表示被标记的注解可以重复声明在类、属性、方法等上面;但@Repeatable注解还是得需要定义容器注解配合才能使用,所以也只是增强了代码的可读性;publicclassAnnotationTest{/***Java8之......
  • Java8新特性之方法引用(三)
    1.方法引用介绍方法引用其实是lambda表达式的升级写法,采用::固定语法,可以使代码更简洁、紧凑;2.方法引用的5种类型2.1对象引用::实例方法名函数式接口抽象方法的形参列表与实例方法的一致,且方法的返回值类型一致;publicclassMethodReferencesTest{publicstaticvo......
  • Java8新特性之接口的默认方法和静态方法(四)
    1.背景介绍在Java8之前,接口中定义的方法都是抽象方法,即默认都是被publicabstract修饰的;但从Java8开始,允许在接口中定义带有方法体的默认方法和静态方法;publicclassInterfaceTest{publicstaticvoidmain(String[]args){}}interfaceInterfaceA{/*......
  • Java8新特性之函数式接口(二)
    1,函数式接口介绍前言:由于Java8中引入了lambda表达式语法,但该语法需要配合一种特定的接口才能使用,由此产生出了函数式接口;函数式接口指有且仅有一个抽象方法(由Object对象继承的方法不算)(但可以有多个默认方法和静态方法)的接口,当这样的接口在作为方法参数时可以隐式的转换为lambda......
  • Java8新特性之Lambda表达式(一)
    Java8新特性之Lambda表达式(一)文章目录1.lambda表达式介绍2.lambda表达式的重要特征3.lambda表达式对域外变量的限制4.lambda表达式的优缺点5.lambda表达式的使用场景6.lambda表达式的实现原理7.相关链接1.lambda表达式介绍lambda表达式是Java8提供的新特......
  • java项目使用Mybatis-Plus插件,QueryWrapper日期开始-结束范围查询
    1、参数开始日期startTime、结束日期endTime挺好用,开始日期、结束日期当天都包含进去了,如果使用qw.between("create_time",startTime,endTime)方法是不含endTime结束日期当天的qw.apply(bCulresCardMvVO.getStartTime()!=null,"date_format(create_time,......
  • day01-java流程控制
    用户交互Scannerjava.util.Scanner是java5的新特征,我们可以通过Scanner类来获取用户的输入。Scanners=newScanner(System.in);​//通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。import......