Java--函数式编程

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的开发包,里面可以直接使用函数式接口,列出几个常用的接口:

  1. 功能性函数式接口(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("**"))}
}
  1. 消费性函数式接口(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") ;
	}
}

  1. 供给性函数式接口(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()) ;
	}
}
  1. 断言性函数式接口(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") );
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43337254/article/details/108007003