1、函数式编程思想 概述
在数学中,函数就是有"输入量、输出量”的一套解决方案,也就是拿数据做操作,
面向对象思想就是强调 “必须通过对象的形式做事情",
而函数式思想尽量忽略面向对象的复杂语法,"强调做什么,而不是以什么形式去做“,
这就是lambda函数表达式思想的体现
下面看一个需求,
1、自定义一个线程实现Runable接口
2、重写run方法
3、创建自定义线程对象,并将它传递给Thread的构造函数
4、启动线程
1.1 原始的方式实现
package com.hzbank.functionalInterface;
public class MyRunable implements Runnable{
@Override
public void run() {
System.out.println("获取线程中的值");
}
}
1.2 创建测试类
package com.hzbank.functionalInterface;
public class TestFuncation {
public static void main(String[] args) {
MyRunable myThead=new MyRunable();
Thread thread=new Thread(myThead);
thread.start();
}
}
这是最原始的方式,我们必须要实现接口,然后创建实现类对象去操作,那么有没有办法去简化它呐?肯定是有的,比如我们常见的匿名内部类,我们无需去实现接口,就可以操作,如
package com.hzbank.functionalInterface;
public class TestFuncation {
public static void main(String[] args) {
//原始方式
//MyRunable myThead=new MyRunable();
//Thread thread=new Thread(myThead);
//thread.start();
Thread thread =new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类实现方式");
}
});
thread.start();
}
}
此时我们还可以优化,那么就是lambda表达式了
2、什么是Lambda表达式?
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)
语法:(形式参数) -> {代码块}
1、形式参数,如果有多个参数,参数之间用逗号隔开,没有参数就留空。
2、->英文中画线和大于符合组成,固定语法,代表指向动作
3、代码块,具体要做的事情,指的是方法体中的内容。
大致分为以下几个情况,我们逐一用lambda实现一下
2.1: 有一个参数无返回值
/**
* 一个参数无返回值
*/
public interface NoReturnOneParam {
public void method(String param);
}
2.2: 有一个参数有返回值
/**
* 一个参数有返回值
*/
public interface OneReturnOneParam {
public String method(String param);
}
2.3: 多个参数无返回值
/**
* 多个参数无返回值
*/
public interface NoReturnMoreParam {
public void method(String name,int age);
}
2.4: 多个参数有返回值
/**
* 多个参数有返回值
*/
public interface MoreRetrunMoreParam {
public String method(String name,int age);
}
2.5:无参数无返回值
/**
* 没有参数没有返回值
*/
public interface NoReturnNoParam {
public void method();
}
2.6:无参数有返回值
/**
* 没有参数没有返回值
*/
public interface NoReturnNoParam {
public void method();
}
2.6 编写测试类 测试一下
package com.hzbank.lambdas;
import java.util.UUID;
public class LambdaTest {
//测试有一个参数,无返回值
public void testNoReturnOneParam(NoReturnOneParam param) {
param.method("陈晨");
}
//测试有一个参数,有返回值
public String testOneReturnOneParam(OneReturnOneParam param) {
return param.method("陈晨");
}
//多个参数无返回值
public void testNoReturnMoreParam(NoReturnMoreParam param) {
param.method("陈晨", 18);
}
//多个参数有返回值
public String testMoreRetrunMoreParam(MoreRetrunMoreParam param) {
return param.method("陈晨", 18);
}
//没有参数没有返回值
public void testNoReturnNoParam(NoReturnNoParam param) {
param.method();
}
//没有参数有返回值
public String testMoreRetrunMoreParam(OneReturnNoParam param) {
return param.method();
}
public static void main(String[] args) {
LambdaTest lambdaTest = new LambdaTest();
lambdaTest.testNoReturnOneParam((String param) -> {
System.out.println("测试有一个参数,无返回值" + "___参数:" + param);
});
System.out.println("..................................");
lambdaTest.testOneReturnOneParam((String param) -> {
System.out.println("测试有一个参数,有返回值" + "___参数:" + param + "___返回值:" + param);
return param;
});
lambdaTest.testNoReturnMoreParam((String name, int age) -> {
System.out.println("多个参数无返回值" + "___参数1:" + name + "___参数2:" + age);
});
lambdaTest.testMoreRetrunMoreParam((String name, int age) -> {
System.out.println("多个参数有返回值" + "___参数1:" + name + "___参数2:" + age + "___返回值:" + "名称:" + name + "年龄:" + age);
return "名称:" + name + "年龄:" + age;
});
lambdaTest.testNoReturnNoParam(() -> {
System.out.println("没有参数没有返回值");
});
lambdaTest.testMoreRetrunMoreParam(() -> {
System.out.println("没有参数有返回值"
+ "___返回值:" + UUID.randomUUID().toString());
return UUID.randomUUID().toString();
});
}
}
lambda表达式有几个省略规则:
1、参数类型可以省略,但在多参数的时候,不能只省略一个参数的类型(就是要么全部省略,要么都不省略)。
2、如果参数只有一个,小括号可以省略。
3、如果代码块只有一条,可以省略大括号和分号,以及return关键字。
再次优化测试类
package com.hzbank.lambdas;
import java.util.UUID;
public class LambdaTest {
//测试有一个参数,无返回值
public void testNoReturnOneParam(NoReturnOneParam param) {
param.method("陈晨");
}
//测试有一个参数,有返回值
public String testOneReturnOneParam(OneReturnOneParam param) {
return param.method("陈晨");
}
//多个参数无返回值
public void testNoReturnMoreParam(NoReturnMoreParam param) {
param.method("陈晨", 18);
}
//多个参数有返回值
public String testMoreRetrunMoreParam(MoreRetrunMoreParam param) {
return param.method("陈晨", 18);
}
//没有参数没有返回值
public void testNoReturnNoParam(NoReturnNoParam param) {
param.method();
}
//没有参数有返回值
public String testMoreRetrunMoreParam(OneReturnNoParam param) {
return param.method();
}
public static void main(String[] args) {
LambdaTest lambdaTest = new LambdaTest();
//lambdaTest.testNoReturnOneParam((String param) -> {
// System.out.println("测试有一个参数,无返回值" + "___参数:" + param);
//});
//简化版,一个参数省略参数类型,省略小括号,主体包含一个语句,省略大括号
lambdaTest.testNoReturnOneParam(param ->
System.out.println("测试有一个参数,无返回值" + "___参数:" + param));
System.out.println("..................................");
// lambdaTest.testOneReturnOneParam((String param) -> {
// System.out.println("测试有一个参数,有返回值" + "___参数:" + param + "___返回值:" + param);
// return param;
// });
lambdaTest.testOneReturnOneParam(param -> param
// System.out.println("测试有一个参数,有返回值" + "___参数:" + param + "___返回值:" + param);
);
//lambdaTest.testNoReturnMoreParam((String name, int age) -> {
// System.out.println("多个参数无返回值" + "___参数1:" + name + "___参数2:" + age);
//});
//简化版 多个参数不可省略小括号,但主体包含一个语句,省略大括号,省略参数类型
lambdaTest.testNoReturnMoreParam((name,age) -> System.out.println("多个参数无返回值" + "___参数1:" + name + "___参数2:" + age)
);
//lambdaTest.testMoreRetrunMoreParam((String name, int age) -> {
// System.out.println("多个参数有返回值" + "___参数1:" + name + "___参数2:" + age + "___返回值:" + "名称:" + name + "年龄:" + age);
// return "名称:" + name + "年龄:" + age;
//});
//简化版,省略参数类型,主体包含一个语句,省略大括号,省略return
lambdaTest.testMoreRetrunMoreParam((name, age) -> "名称:" + name + "年龄:" + age);
//
// lambdaTest.testNoReturnNoParam(() -> {
// System.out.println("没有参数没有返回值");
// });
//简化版:
lambdaTest.testNoReturnNoParam(() -> {});
lambdaTest.testMoreRetrunMoreParam(() -> {
System.out.println("没有参数有返回值"
+ "___返回值:" + UUID.randomUUID().toString());
return UUID.randomUUID().toString();
});
}
}