函数式编程思想概述
数学中的函数特点:
-
输入值
-
f(x)
-
输出值
相较于面向对象过分强调必须通过对象的形式来做事情,函数式思想尽量忽略面向对象的复杂语法。强调:
做什么,而不是什么形式做
面向对象的思想
-
做一个事情
-
找一个能完成事情的对象
-
调用对象的方法
-
完成事情
函数式的编程思想
-
只要获取到结果
-
谁去做的、怎么做的不重要
重视结果而不重视过程
冗余的Runnable代码
传统写法:
package PracticeReview.ThreadPool;
/**
* 使用实现Runnable接口的方式实现多线程程序
* @since JDK 1.8
* @date 2021/07/22
* @author Lucifer
*/
public class RunnableDemoNo1 {
public static Runnable getRunnableImpl(Runnable runnable){
//创建接口的实现类对象引用
RunnableImpl r = new RunnableImpl(); //--->线程已经创建了
//创建Thread类对象引用,构造方法中传递Runnable接口的实现类
Thread thread = new Thread(runnable);
//调用start方法开启新线程--->只是加入队列
thread.start();
return runnable;
}
public static void getThreadImpl(Runnable runnable){
//使用匿名内部类实现多线程程序--->返回一个匿名内部类,用接口接收
runnable = new Runnable(){
关键点
-
Thread
类需要Runnable
接口作为参数,其中的抽象run
方法是线程执行的逻辑 -
指定
run
的方法体,必须要Runnable
接口的实现类 -
为了省区定义一个
RunableImpl
实现类的麻烦,不得不使用匿名内部类 -
必须重写抽象的
run
方法 -
然后线程当中只有方法体才是关键
函数式编程思想的转换
做的事情:
将run
方法体内的代码传递给Thread
类知晓
Lambda表达式
package PracticeReview.ThreadPool;
/**
* 使用匿名内部类+lambda的方式实现多线程
*/
public class LambdaDemoNo1 {
public static void main(String[] args) {
//使用Lambda表达式实现多线程
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "This is a new lambda expression!");
}).start();
/*
new 线程对象的时候这个里面的()代表的是run方法的(),--->run方法有参数这里面就有参数
后面{}就是重写run方法的大括号,这就是一个lambda表达式
*/
}
}
优点:
-
省去了实现类的定义以及语法结构
Lambda表达式的标准格式
组成部分:
-
一些参数:
-
一个箭头:"->"
-
一段代码
('参数列表') -> {
//重写方法的代码
}
/*
():接口中抽象方法的参数列表,无参数就空着,有参数就写出。多个参数用,分割
->:把参数传递给方法体
{}:重写接口的抽象方法的方法体
*/