java中的lambda表达式
java中的lambda表达式
java的lambda表达式是调用类的快捷书写方法。lambda表达式可以带参数也可以不带参数,接下来分为无参数的情况和有参数的情况来理解lambda表达式。
无参数
外部类
以下代码通过构建一个外部类来定义接口功能:
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
JustDoIt justDoIt = new JustDoIt();
justDoIt.justDo();
}
}
interface DoThing{
void justDo();
}
class JustDoIt implements DoThing{
@Override
public void justDo() {
System.out.println("i am doing1");
}
}
输出结果:
i am doing1
静态内部类
以下代码通过构建一个静态内部类来定义接口功能:
package com.cxf.multithread.lambda;
public class TestForLamda {
static class JustDoIt implements DoThing{
@Override
public void justDo() {
System.out.println("i am doing2");
}
}
public static void main(String[] args) {
JustDoIt justDoIt = new JustDoIt();
justDoIt.justDo();
}
}
interface DoThing{
void justDo();
}
输出结果:
i am doing2
局部内部类
以下代码通过构建一个局部内部类来定义接口功能:
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
class JustDoIt implements DoThing{
@Override
public void justDo() {
System.out.println("i am doing3");
}
}
JustDoIt justDoIt = new JustDoIt();
justDoIt.justDo();
}
}
interface DoThing{
void justDo();
}
输出结果:
i am doing3
匿名内部类
以下代码通过构建一个匿名内部类来定义接口功能:
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
DoThing justDoIt = new DoThing() {
@Override
public void justDo() {
System.out.println("i am doing4");
}
};
justDoIt.justDo();
}
}
interface DoThing{
void justDo();
}
输出结果:
i am doing4
lambda表达式
以下代码通过构建一个外部类来定义接口功能:
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
DoThing justDoit = () -> {
System.out.println("I am doing 5");
};
justDoit.justDo();
}
}
interface DoThing{
void justDo();
}
输出结果:
I am doing 5
lambda表达式是从外部类经过上述介绍顺序简化而来,它简洁地重写了接口方法并实现了接口。
使用lambda表达式的条件是,已经定义了一个接口,并且这个接口只有一个void方法。
有参数
接下来是接口void方法有参数的情况。
外部类
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
JustDoIt justDoIt = new JustDoIt();
justDoIt.justDo(1);
}
}
interface DoThing{
void justDo(int a);
}
class JustDoIt implements DoThing{
@Override
public void justDo(int a) {
System.out.println("i am doing"+a);
}
}
输出结果:
i am doing1
静态内部类
package com.cxf.multithread.lambda;
public class TestForLamda {
static class JustDoIt implements DoThing{
@Override
public void justDo(int a) {
System.out.println("i am doing"+a);
}
}
public static void main(String[] args) {
JustDoIt justDoIt = new JustDoIt();
justDoIt.justDo(2);
}
}
interface DoThing{
void justDo(int a);
}
输出结果:
i am doing2
局部内部类
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
class JustDoIt implements DoThing{
@Override
public void justDo(int a) {
System.out.println("i am doing"+a);
}
}
JustDoIt justDoIt = new JustDoIt();
justDoIt.justDo(3);
}
}
interface DoThing{
void justDo(int a);
}
输出结果:
i am doing3
匿名内部类
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
DoThing justDoIt = new DoThing() {
@Override
public void justDo(int a) {
System.out.println("i am doing"+a);
}
};
justDoIt.justDo(4);
}
}
interface DoThing{
void justDo(int a);
}
输出结果:
i am doing4
lambda表达式
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
DoThing justDoit = (int a) -> {
System.out.println("I am doing"+a);
};
justDoit.justDo(5);
}
}
interface DoThing{
void justDo(int a);
}
输出结果:
I am doing5
有参数的lambda表达式还可以进一步简化:
package com.cxf.multithread.lambda;
public class TestForLamda {
public static void main(String[] args) {
DoThing justDoit = a ->
System.out.println("I am doing"+a);
justDoit.justDo(5);
}
}
interface DoThing{
void justDo(int a);
}
去掉了参数类型、括号、花括号,结果依旧相同。
重写方法体中如有多行,仍需加上花括号。
多个参数时也可以去掉参数类型。