# Java函数式 **Repository Path**: wang-yanan_RIse/java-functional-expression ## Basic Information - **Project Name**: Java函数式 - **Description**: Java函数式(三更草堂) 学习笔记(记录) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-06-19 - **Last Updated**: 2024-06-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 函数式接口 只有一个抽象方法的接口我们称之为函数式接口。 JDK的函数式接口都加上了@FunctionalInterface注解进行标识,但是无论是否加上该注解只要接口中 只 有一个抽象方法,都是函数式接口。 常见的函数式接口: Consumer 消费接口 Function 计算转换接口 ## 方法引用: 我们在使用lambda时,如果方法体重只有一个方法的调用的话(包括构造方法),我们可以用方法引用进一步简化代码 ### 推荐用法 我们在使用lambda时不需要考虑什么时候用方法引用,用那种方法引用,方法引用的格式是什么。我们只需要在写完lambda方法发现 方法体只有一行代码,并且是方法的调用时使用快捷键尝试是否能转换为方法引用即可。 ### 基本格式 类名或者对象名::方法名 ### 语法详解(了解) #### 引用类的静态方法 其实就是引用类的静态方法 ##### 格式 类名::方法名 ##### 使用前提 如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的静态方法, 并且我们把重写的抽象方法中所有的参数都传入了这个静态方法中,这个时候我们就可以引用类的静态方法。 #### 引用对象的实例方法 ##### 格式 对象名::方法名 ##### 使用前提 如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个对象的成员方法, 并且我们要把要重写的抽象方法中的所有参数都按照顺序传入这个成员方法中,这时候我们就可以应用对象的实例方法。 #### 引用类的实例方法 ##### 格式 类名::方法名 ##### 使用前提 如果我们在重写方法的时候,方法体中只有一行代码,,并且这行代码是 调用了第一个参数的成员方法 , 并且我们把要重写的抽象方法中剩余的所有参数都按照顺序传入了这个成员方法中,这个时候我们就可以引用类的实例方法 #### 构造器引用 如果方法中的一行代码是构造器的话就可以使用构造器引用 ##### 格式 类名::new ##### 使用前提 如果我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的构造方法, 并且我们把要重写的抽象方法中的所有参数都按照顺序传入了这个构造方法中,这个时候我们就可以引用构造器。 ## 高级用法 ### 基本数据类型优化 我们之前用到很多Stream的方法都是用到了泛型,所以涉及到的参数和返回值都是引用数据类型。 即使我们操作的实整数小数,但是实际用的都是他们的包装类。JDK5 中引入的自动装箱和自动拆箱让我们在使用对应的包装类好像 使用基本数类型一样方便。但是你要知道,装箱和拆箱是要消耗时间的。虽然这个时间消耗很大,但是在大量的数据不断的重复 装箱和拆箱的时候你就不能无视这个时间损耗了。 所以为了让我们能够这部分时间的消耗进行优化。Stream还提供了很提供了很多专门针对基本数据类型的方法。 mapToInt,mapToLong,mapToDouble、flatMapToInt、floatMapToDouble等 ### 并行流 当流中有大量数据元素的时候,我们可以使用并行流去提高操作的效率。其实并行流就是把任务分配给多个线程去完成。 如果我们自己去用代码实现的话其实会非常的复杂,并且要求你对并发编程有足够的了解和认识。而如果我们使用Stream的话, 我们只需要修改一个方法的调用就可以使用并行流来帮助我们实现,从而提高效率。 .parallel() 开启并行流执行 .peek()可以帮助我们调试打印操作操作元素等。