JDK 1.8 新特性
lambda 表达式(实现接口的一种方式)
lamdba 表达式 细节(条件)
- 必须要有接口 (函数式接口)
- 接口中有且只能有一个方法
.
函数式接口
--必须是一个接口
--该接口中有且只能有一个方法
@FunctionalInterface 函数式接口
Lambda介绍
Lambda表达式,是JDK8中最重要的一个特性,它可以很方便地优化我们的代码, 它是函数式编程的java版。在JDK8中,通过Lambda表达式,可以把代码块当参数传递。
接口中只能有一个抽象方法
Lambda 是接口的实现 ,准确的讲师函数式接口的实现
Lambda 的快速体验
publicstaticvoid main(String[] args) { // // MyRunnable mr = new MyRunnable();// // Thread t = new Thread(mr);// t.start(); // Thread t = new Thread(new Runnable() {// // @Override// public void run() {// // System.out.println("多线程启动了...");// // }// });// // t.start(); Thread t = new Thread(()->{ System.out.println("多线程启动了.."); }); t.start(); } |
---|
Lamdba表达式的格式
Lambda表达式有三个部分
- 参数列表。
- 箭头——箭头->把参数列表与Lambda主体分隔开。
- Lambda主体。
Lambda表达式的快速体验
publicinterface Testlmdba { publicvoid test1();} |
---|
publicstaticvoid main(String[] args) { Testlmdba t = ()->{ System.out.println("我来了"); }; t.test1(); } |
---|
格式2
publicinterface Testlmdba { //public void test1(); publicvoid test2(inta,intb);} |
---|
Testlmdba t =(inta,intb)->{ System.out.println(a b); }; t.test2(10, 20); |
---|
使用类型推断后
Testlmdba t =(a,b)->{ System.out.println(a b); }; t.test2(10, 20); |
---|
有返回值
publicinterface Testlmdba { //public void test1(); //public void test2(int a,int b); publicint test3(inta,intb); } |
---|
Testlmdba t = (inta,intb)->{ System.out.println("我在这里哦"); System.out.println("我也在这里哦.."); returna b; }; intsum = t.test3(10, 20); System.out.println(sum); |
---|
如果 大括号中只有一条语句,大括号也可以省略
对于有return 返回值的 return 也不要写了
Testlmdba t = (inta,intb)->
// System.out.println("我在这里哦");
// System.out.println("我也在这里哦..");
a b;
intsum = t.test3(10, 20);
System.out.println(sum);
函数式接口
@FunctionalInterfacepublicinterface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ publicabstractvoid run();} |
---|
总体代码实战如下:
代码语言:javascript复制package demo01;
@FunctionalInterface // 明确标记当前是函数式接口
// 如果当前接口不是函数式接口,会立马报错!!
public interface MyFun1 {
//抽象方法
// 该方法 是没有返回值 空参
//public void test1();
// 计算 两个数的和
//参数列表 (参数类型 参数名称)
//public void test2(int a,int b);
// 计算 两个数的和 有返回值
public int test3(int a,int b);
}
代码语言:javascript复制package demo01;
public class DemoTest1 {
public static void main(String[] args) {
///MyFun1 m1 =
//
// MyFun1 m1=()->{
// System.out.println("我来也..");
// };
// m1.test1();
//MyFun1 m1=()->{System.out.println("我来也..");};
// MyFun1 m2 =(int a,int b)->{
//
// System.out.println(a b);
//
// };
// MyFun1 m2 =(a,b)->{
//
// System.out.println(a b);
//
// };
//MyFun1 m2 =(a,b)->System.out.println(a b);
// 必须要有接口 接口只允许存在一个方法(抽象方法)
// MyFun1 m2 = new MyFun1Impl() 实现类必须实现接口的 抽象方法
// MyFun1 m2 = new MyFun1(实现接口的方法) -> 匿名内部类的写法
// lamdba 表达式 其本质就是 接口的实例 (实现类)
/**
* (a,b)->System.out.println(a b)
*
* -> 箭头符号是lamdba 表达式的固定写法 (指向)
*
* 箭头左边表示形参列表 (参数类型 参数名称)
*
* 箭头右边表示 对 接口中方法做的具体实现
* lamdba表示的精简写法;
*
* a.接口中参数列表已经明确定义了 参数类型,而 lamdab 表达式只是对其做实现,所以无需再次 定义参数类型
* b.如果lamdba 表达式中 接口的实现 中 大括号中有且只有一行代码,大括号可以直接省略
* c.如果有return 返回值,省略大括号的时候,return 也不能加
*
*/
MyFun1 m1 =(int a,int b)->a b;
int sum = m1.test3(10, 10);
System.out.println(sum);
//m2.test2(10, 10);
}
}
实现接口的方式有三种 :
1、传统的实现接口的方法(使用多态思想)
2、使用匿名内部类来实现
代码语言:javascript复制
// 方式2 直接使用匿名内部类方式 实现操作
// Thread t2 = new Thread(new Runnable() {
//
// @Override
// public void run() {
//
// System.out.println("我是多线程启动了...");
//
// }
// });
//t2.start();
3、使用lambda表达式(具备两个条件才能使用该方法)
代码语言:javascript复制// lamdba 表达式
Runnable r = ()->{
System.out.println("我是一个多线程启动了");
};
Thread t = new Thread(r);
t.start();
}
}