函数式编程
很多开发语言都开始支持函数式编程,其中最具备代表性的就是haskell。函数式编程和面向对象编程可以理解为两大开发阵营。
在函数式编程中,所有的数据都是不可变的,不同的函数之间通过数据流来交换信息,函数享有跟数据一样的地位,可以作为参数传递给下一个函数,同时也可以作为返回值。函数式编程的表达方式更加符合人类日常生活中的语法,代码可读性也更强。实现同样的功能,函数式编程比面向对象编程要少代码,所以更加容易看懂和理解。
与面向对象编程代码上的区别(用java演示)
java在jdk1.8之后,推出了lambda表达式,用于函数式编程,操作符为->。
看 一段代码:
java中利用接口定义一个方法,由匿名内部子类实现,实例化后调用。
interface IMessage {
void print();
}
public class lambda表达式 {
public static void main(String[] args) {
IMessage message = new IMessage() {
@Override
public void print() {
System.out.println("hello IMessage");
}
};
message.print();
}
}
实现同样的功能,用lambda表达式:
interface IMessage {
void print();
}
public class lambda表达式 {
public static void main(String[] args) {
IMessage message = () -> System.out.println("hello IMessage");
message.print();
}
}
这就是lambda表达式基本用法。
总结一下
1、面向对象语法最大的局限:结构必须非常完整。
2、函数式编程简单,容易实现,但接口只能有一个方法,不然无法确定覆写哪个方法。
3、所以有了一个新的注解: @FunctionalInterface,表示这个是函数式编程的接口,如果有2个以上方法就会提示错误。
4、语法:(参数)-> {覆写接口唯一方法的代码}
(参数)-> {覆写接口唯一方法的代码}
多行代码演示:
interface IMessage {
void print();
}
public class lambda表达式 {
public static void main(String[] args) {
IMessage message = () -> {
System.out.println("hello IMessage1");
System.out.println("hello IMessage2");
System.out.println("hello IMessage3");
};
message.print();
}
}
用处
比如多线程Thread覆写run的时候
public class Test {
public static void main(String[] args) {
//方式一
Runnable runnable = () -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
Thread thread = new Thread(runnable);
//方式二
Thread thread1 = new Thread(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}