Lambda表达式
Lamda表达式如果要想使用,那么必须有一个重要的实现要求: SAM ( Single Abstract Method), 下面以只有一个抽象方法的IMessage接口为例,在这个接口里面发现只是提供有一个 send()方法,除此之外没有任任何的其它方法定义,所以这样的接口称为函数式接口,而只有函数式接口才可以被Lambda表达式所使用。
@FunctionalInterface //函数式接口
interface IMessage {
public void send(String str) ;
}
public class JavaDemo {
public static void main(String args[]) {
IMessage msg = (str)->{//避免了使用匿名内部类,使程序更加的简洁
System.out.println("发送消息:"+ str) ;
};
msg.send( "www.csdn.com") ;
/*如果不使用Lambda,那么mian()方法里面应该是:
IMessage msg = new IMessage () {
public void send(String str) {
System.out.println("消息发送:"+ str) ;
}
};
msg.send("www.csdn.com");
*/
}
}
利用Lambda表达式可以摆脱传统面向对象之中关于结构的限制,但也仅限于只有一个方法的函数式接口。
对于Lambda表达式而言,提供有如下几种格式:
- 方法没有参数: () -> {};
- 方法有参数: (参数,参数) -> {};
- 如果现在只有一行语句返回: (参数, 参数) -> 语句;
方法引用
在Java中提供有方法的四种引用形式:
- 引用静态方法: 类名称 :: static方法名称;
@FunctionalInterface //函数式接口
//p描述的是参数、R描述的是返回值
interface IFunction<P,R> {
public R change(P p) ;
}
public class JavaDemo {
public static void main(String args [] ) {
IFunction<Integer,String> fun = String :: valueOf;
String str = fun.change(100) ;
System.out.println(str.length()) ;
}
}
- 引用某个实例对象的方法: 实例化对象 :: 普通方法;
@FunctionalInterface //函数式接口
// R描述的是返回值
interface IFunction<R> {
public R upper() ;
}
public class JavaDemo {
public static void main(String args[]) {
IFunction<String> fun = "www.csdn.com" :: toUpperCase ;//转大写,本来此方法要实例化对象才能使用
System.out.println(fun.upper()) ;
}
}
- 引用特定类型的方法: 特定类 :: 普通方法;
@FunctionalInterface //函数式接口
// P描述的是参数、R描述的是返回值
interface IFunction<P> {
public int compare(P p1,P p2) ;
}
public class JavaDemo {
public static void main(String args[]) {
IFunction<String> fun = String :: compareTo ;//比较字符大小,此方法本来需要实例化对象,但如果现在不想使用实例化对象,这个时候就可以使用特定类的方法引用
System. out. println(fun. compare("A","a")) ;
}
}
- 引用构造方法: 类名称 :: new;
class Person {
private String name ;
private int age ;
public Person (String name,int age) {
this .name = name ;
this.age = age ;
}
public String toString() {
return "姓名:”+ this.name + "、年龄:”+ this.age ;
}
//getter、setter方法略
}
@FunctionalInterface //函数式接口
interface IFunction <R> {
public R create (String s,int a) ;
}
public class JavaDemo {
public static void main (String args[] ) {
IFunction<Person> fun = Person :: new ;//构造方法的引用处理
System.out.println(fun. create("张三",20)) ;
}
}
利用方法的引用可以为一个方法定义多个名字,但是要求必须是函数式接口
内建函数式接口
在系统之中专门提供有一个java.util fiunction的开发包,里面可以直接使用函数式接口,列出几个常用的接口:
- 功能性函数式接口(Function): 接受并返回一个值,比如判断是否已指定的字符串开头
import java.util.function.* ;
public class JavaDemo {
public static void main( String args[]) {
Function< String,Boolean> fun = "**Hello" :: startsWith;//引用方法判断是否是以指定字符开头
System.out. println( fumn.apply("**")),
}
}
- 消费性函数式接口(Consumer ): 只能够进行数据的处理而没有返回
import java . util . function.* ;
public class JavaDemo {
public static void main (String args []) {
Consumer <String> con = System.out :: println ;//引用系统输出方法
con. accept ( "www.csdn.com") ;
}
}
- 供给性函数式接口(Supplier ): 永远提供输出功能(只提供返回值)
import java . util. function.* ;
public class JavaDemo {
public static void main (String args[]) {
Supplier <String> sup = "www.CSDN.com" :: toLowerCase ;//引用转小写的方法
Sys tem. out.println(sup.get()) ;
}
}
- 断言性函数式接口(Predicate): 进行判断处理
import java . util. function.* ;
public class JavaDemo {
public static void main(String args []) {
Predicate<String> pre = "csdn" :: equalsIgnoreCase;
System.out.println(pre. test ("CSDN") );
}
}