1、Lambda表达式
从JDK1.8开始为了减缓使用者进行代码开发,专门提供了Lambda表达式支持,利用此操作形式可以实现函数式的编程。比较著名的函数式编程语言:Haskell、Scala。利用函数式编程可以避免一些面向对象编程中的一些繁琐的处理问题。
分析传统匿名内部类:
interface IChannel {
public void send(String str) ;
}
public class LambdaDemo {
public static void main(String[] args) {
IChannel ic = new IChannel() {
public void send(String str) {
System.out.println(str) ;
}
};
ic.send("一只瓶子a");
}
}
在这样一个程序里核心功能:“ System.out.println(str) ;”,为此一行核心语句仍需要按照完整的面向对象给出的设计结构进行开发。
使用Lambda表达式实现:
@FunctionalInterface //标记为函数式接口
interface IChannel {
public void send(String str) ;
}
public class LambdaDemo {
public static void main(String[] args) {
IChannel ic = (str)->{
System.out.print(str);
};
ic.send("一只瓶子a");
}
}
Lambda表达式使用时的重要实现要求:SAM(Single Abstract Method),只有一个抽象方法(可以有其他方法)——函数式接口。只有函数式接口才能使用Lambda表达式。
Lambda表达式的几种格式:
①方法没有参数:()-> {}
②方法有参数:(参数,参数)-> {}
③只有一行返回语句:(参数,参数)-> 语句;
2、方法引用
从JDK1.8之后提供有方法的引用,即,不同的方法名称可以描述同一个方法。四种形式:
①引用静态方法:类名称 ::static 方法名称
@FunctionalInterface //标记为函数式接口
//P描述的是参数类型,R描述的是返回值类型
interface IChannel<P,R> {
public R change(P p) ;
}
public class LambdaDemo {
public static void main(String[] args) {
// 引用String类中的静态方法valueOf()
IChannel<Integer, String> ic = String :: valueOf ;
String str = ic.change(100);
System.out.println(str.length());
}
}
②引用某个实例对象的方法:实例化对象 ::普通方法
// 引用某个实例对象的方法
IFunction<String> fun = "aaa"::toUpperCase;
③引用特定类的方法:特定类::普通方法
// 引用特定类中的方法
IFunction<String> fun = String::compareTo;
④引用构造方法:类名称::new
3、内建函数式接口(系统提供)
在java.util.function开发包里有可以直接使用的函数式接口。核心接口:
①功能型函数接口
接口定义:接收一个参数并返回一个参数
@FunctionalInterface
public interface Function<T,R> {
public R apply(T t)
}
例:
public class LambdaDemo {
public static void main(String[] args) {
//使用内建函数式接口,引用实例对象的方法
Function<String,Boolean> fun = "**hello" :: startsWith ;
System.out.println(fun.apply("**"));
}
}
②消费型函数式接口:只进行数据处理,不返回
@FunctionalInterface
public interface Consumer<T>{
public void accept(T t);
}
例:
Consumer<String> con = System.out :: println ;
con.accept("aaaa"); //输出aaaa
③供给型函数式接口:不接收参数
@FunctionalInterface
public interface Supplier<T>{
public T get();
}
例:
Supplier<String> sup = "aAa" :: toLowerCase ;
System.out.println(sup.get());
④断言型函数式接口:输出为boolean型
@FunctionalInterface
public interface Predicate<T>{
public boolean test(T t);
}
例:
Predicate<String> pre = "a" :: equalsIgnoreCase ;
System.out.println(sup.test("A")); //输出true