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);
}
去掉了參數類型、括號、花括號,結果依舊相同。
重寫方法體中如有多行,仍需加上花括號。
多個參數時也可以去掉參數類型。