函数式编程
Lambda表达
只有一个方法的函数式接口才可以使用Lambda,@Funcctionalinterface注解表示是函数式接口
1、用Lamda表达式精简数据,举例
interface IMessage{
public void send(String str);
}
public class Demo{
public static void main(String[] args) {
IMessage msg=new IMessage(){
public void send(String str){
System.out.println("发送消息"+str);
}
};
msg.send("coco");
}
}
运行后
发送消息coco
使用Lamda表达式后
interface IMessage{
public void send(String str);
}
public class DemoLambda{
public static void main(String[] args) {
IMessage msg=(str)->{System.out.println("发送消息"+str);};
msg.send("coco");
}
}
Lambda表达式提供的格式
-
方法没有参数:()->{};
-
方法有参数: (参数,参数)->{};
-
如果现在只有一行语句返回:(参数,参数)->语句;
方法引用
1、引用数据最大的特点是可以进行内存的指向处理
2、方法引用:不同的方法名称可以描述同一个方法。如果要进行方法的引用,有以下四种形式
- 引用静态方法: **类名称::static方法名称 **
- 引用某个实例对象的方法:实例化对象::普通方法
- 引用特定类型的方法: 特定类::普通方法
- 引用构造方法: 类名称::new
}3、实际应用
1)引用静态方法:在String类里提供String.valueOF()方法,这个方法就是静态方法。
@FunctionalInterface
interface IFunction<P,R>{//P描述的是参数,R描述的是返回值
public R 转换(P p);
}
public class Demo{
public static void main(String[] args) {
IFunction<Integer, String> fun=String :: valueOf;
String str =fun.转换(100);
System.out.print(str.length());
}
}
结果:
3
2)引用某个实例对象的方法:toUpper,此方法必须在有实例化对象提供的情况下才可以使用
@FunctionalInterface
interface IFunction<R>{//P描述的是参数,R描述的是返回值
public R upper();
}
public class Demo{
public static void main(String[] args) {
IFunction< String> fun="String" :: toUpperCase;
System.out.print(fun.upper());
}
}
结果
STRING
3)引用特定类中的方法:比较大小的方法。compareTo
@FunctionalInterface
interface IFunction<P>{//P描述的是参数,R描述的是返回值
public int compare(P p1,P p2);
}
public class Demo{
public static void main(String[] args) {
IFunction< String> fun=String :: compareTo;
System.out.print(fun.compare("A","a"));
}
}
结果
-32