flash 网站头部,网易163企业邮箱登录入口,c2c网站都有哪些,网站建设找刘贺稳营销专家文章目录函数式接口概述函数式接口示例内置函数式接口Lambda简述Lambda语法方法引用构造器引用数组引用函数式接口概述
只包含一个抽象方法的接口#xff0c;称为函数式接口。
可以通过 Lambda 表达式来创建该接口的对象。
可以在一个接口上使用 FunctionalInterface 注解称为函数式接口。
可以通过 Lambda 表达式来创建该接口的对象。
可以在一个接口上使用 FunctionalInterface 注解这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明说明这个接口是一个函数式接口。
在java.util.function包下定义了Java 8 的丰富的函数式接口。
在函数式编程语言当中函数被当做一等公民对待。在将函数作为一等公民的编程语言中Lambda表达式的类型是函数。但是在Java8中有所不同。在Java8中Lambda表达式是对象而不是函数它们必须依附于一类特别的对象类型——函数式接口。
简单的说在Java8中Lambda表达式就是一个函数式接口的实例。这就是Lambda表达式和函数式接口的关系。也就是说只要一个对象是函数式接口的实例那么该对象就可以用Lambda表达式来表示。所以用匿名实现类表示的现在都可以用Lambda表达式来写。 函数式接口示例
1、Runnable接口 2、自定义函数式接口
FunctionalInterface
public interface MyFunctional01{public String getValue();
}//使用泛型
FunctionalInterface
public interface MyFunctional02T{public T getValue(T t);
}3、作为参数传递 Lambda 表达式
public class LambdaTest {public static void main(String[] args) {String newStr toUpperString(str - str.toUpperCase(),abcDEf);System.out.println(newStr);}public static String toUpperString(MyFuncString my,String str){return my.getValue(str);}
}FunctionalInterface
interface MyFuncT{public T getValue(T t);
}内置函数式接口 import java.util.function.Consumer;/*** Author: Yeman* Date: 2021-10-03-22:50* Description:*/
public class LambdaTest {public static void main(String[] args) {ConsumerInteger consumer i - System.out.println(i);consumer.accept(9);}
}Lambda简述
Lambda 是一个匿名函数我们可以把 Lambda 表达式理解为是一段可以传递的代码将代码像数据一样进行传递。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格使Java的语言表达能力得到了提升。
其本质是作为函数式接口只有一个抽象方法的实例。
Lambda 表达式在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “-” 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分 ①左侧指定了 Lambda 表达式需要的参数列表。 ②右侧指定了 Lambda 体是抽象方法的方法体。 Lambda语法
1、无参无返回值
public class LambdaTest {public static void main(String[] args) {//未使用Lambda表达式Runnable runnable1 new Runnable() {Overridepublic void run() {System.out.println(这是第一个语法);}};runnable1.run();System.out.println();//使用Lambda表达式Runnable runnable2 () - {System.out.println(这是用了Lambda表达式的一个语法);};runnable2.run();}
}2、一个参数无返回值 3、数据类型可以省略因为可由编译器推断得出称为“类型推断” 4、Lambda 若只需要一个参数时参数的小括号可以省略 5、Lambda 需要两个或以上的参数多条执行语句并且可以有返回值 6、当 Lambda 体只有一条语句时return 与大括号若有都可以省略 方法引用
当要传递给Lambda体的操作已经有实现的方法了可以使用方法引用。
方法引用可以看做是Lambda表达式深层次的表达。换句话说方法引用就是Lambda表达式也就是函数式接口的一个实例通过方法的名字来指向一个方法可以认为是Lambda表达式的一个语法糖。
要求实现接口的抽象方法的参数列表和返回值类型必须与方法引用的方法的参数列表和返回值类型保持一致。
格式使用操作符 “::” 将类(或对象)与方法名分隔开。
如下三种主要使用情况 ①对象::非静态方法名 ②类::静态方法名 ③类::非静态方法名
示例
import java.util.Comparator;
import java.util.function.Consumer;/*** Author: Yeman* Date: 2021-10-03-22:50* Description:*/
public class LambdaTest {public static void main(String[] args) {ConsumerInteger consumer i - System.out.println(i);consumer.accept(9);ConsumerString stringConsumer System.out :: println;stringConsumer.accept(Hello);ComparatorInteger comparable (x, y) - Integer.compare(x,y);System.out.println(comparable.compare(2,9));ComparatorInteger integerComparator Integer :: compare;System.out.println(integerComparator.compare(9,2));}
}构造器引用
格式ClassName::new
与函数式接口相结合自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法要求构造器参数列表要与接口中抽象方法的参数列表一致且方法的返回值即为构造器对应类的对象。 数组引用
可以将数组看作一个类则数组引用就类似于构造器引用。
格式type[] :: new
import java.util.function.Function;/*** Author: Yeman* Date: 2021-10-03-22:50* Description:*/
public class LambdaTest {public static void main(String[] args) {FunctionInteger,String[] function length - new String[length];String[] apply function.apply(3);System.out.println(apply[2]);System.out.println();FunctionInteger,String[] function1 String[] :: new;System.out.println(function1.apply(5));}
}