传统接口访问
1package com.atguigu.juc.lambda;
2
3public class lambdademo {
4 public static void main(String[] args) {
5 Foo foo = new Foo() {
6 @Override
7 public void sayHello() {
8 System.out.println("你好");
9 }
10 };
11 }
12}/**Output
13你好
14*///~
15
16interface Foo {
17 public void sayHello();
18}
这是我们直接用匿名内部类实现接口未实现的方法进行接口的实例化. 下面我们来看看一个更为优质的代码
函数式接口
何为函数式接口?
通俗来讲就是接口中只有一个未实现的方法
1// 函数式接口
2interface Foo {
3 public int add(int x, int y);
4
5}
1// 非函数式接口(即普通标准接口)
2interface Foo {
3 public int add(int x, int y);
4 public void sayHello();
5
6}
java提供了一个注解@FunctionalInterface
,让我们很清楚地知道一个接口是否为函数式接口
1@FunctionalInterface
2interface Foo {
3 public int add(int x, int y);
4}
注意:函数式接口并不是说该接口中只有一个方法,而是一个未实现的方法
,下面这个接口也属于函数式接口
1@FunctionalInterface
2interface Foo {
3 // 未实现方法
4 public int add(int x, int y);
5
6 // 已实现方法
7 public default int dev(int x, int y) {
8 return x / y;
9 }
10
11 // 已实现方法
12 public static int mul(int x, int y) {
13 return x * y;
14 }
15
16}
Lambda表达式
Lambda表达式是jkd1.8的新特征,Lambda表达式着力于简化代码的编写,去除冗余代码.
上面例子的优化代码如下
1package com.atguigu.juc.lambda;
2
3public class lambdademo {
4 public static void main(String[] args) {
5
6 Foo foo = () -> {
7 System.out.println("你好");
8 };
9 foo.sayHello();
10
11 }
12}/**Output
13你好
14*///~
15
16interface Foo {
17 public void sayHello();
18}
注意:运用Lambda表达式实现接口中未实现的方法的前提是Foo
接口是函数式接口,如果该接口不是函数式接口,使用Lambda表达式就会出错.
上面使用Lambda表达式的例子中,接口的未实现的方法没有参数也没有返回值,那有返回值和参数如何使用Lamda表达式呢?
我们来看一下代码
1package com.atguigu.juc.lambda;
2
3public class lambdademo {
4 public static void main(String[] args) {
5
6 Foo foo = (int x ,int y) -> {return x + y;};
7 System.out.println(foo.add(3, 5));
8
9 }
10}/**Output
118
12*///~
13
14interface Foo {
15 public int add(int x, int y);
16}
Lambda表达式使用总结:
拷贝小括号,写死右箭头,落地大括号