天天看點

Java使用lamda表達式簡化代碼

代碼,自然寫的越簡潔越好啦,寫的人舒服,看的人也舒服,一切為了高效。

要把有限的時間花到其它有意思的事情上去。

目的

學習簡化代碼的思路,使用jdk8新特性lamada表達式。

推理一下

某接口,隻有一個方法。

比如這個:

package java.lang;

@FunctionalInterface
public interface Runnable {
    void run();
}           

或者是這個:

interface MyInterface{
    void sayHi();
}           

實作接口,使用方法

一般我們要使用Runable子類開啟一個線程,要實作Runnable接口,調用Threead類的start方法:

public class LeaningLamda implements Runnable{
    public static void main(String[] args) {
        new Thread(new LeaningLamda()).start();
    }
    @Override
    public void run() {
        System.out.println(this.getClass()+"我已經在跑了!");
    }
}           

或者用sayHi方法幹點什麼,要先實作接口,再調用:

public class LeaningLamda2 implements MyInterface{
    public static void main(String[] args) {
        new LeaningLamda2().sayHi();
    }

    @Override
    public void sayHi() {
        System.out.println("ok ok ok ok ,i am say Hi!");
    }
}
interface MyInterface{
    void sayHi();
}           

内部類實作接口,使用方法

如果這個方法我就用一次,那我可以在内部類中實作它,提高程式性能:

public class LeaningLamda{
    static class MyRun implements Runnable{
        @Override
        public void run() {
            System.out.println(this.getClass()+"我已經在跑了!");
        }
    }

    public static void main(String[] args) {
        new Thread(new MyRun()).start();
    }
}           

一樣的用sayHi方法:

public class LeaningLamda2 {
    static class MyHi implements MyInterface{
        @Override
        public void sayHi() {
            System.out.println("ok ok ok ok ,i am say Hi!");
        }
    }

    public static void main(String[] args) {
        new MyHi().sayHi();
    }
}
interface MyInterface{
    void sayHi();
}           

局部内部類實作接口,使用方法

既然隻使用一次,那我為啥不把它放在使用的方法裡面去,性能不就又UpUpUpUp。

像這樣:

public class LeaningLamda{
    public static void main(String[] args) {

        class MyRun implements Runnable{
            @Override
            public void run() {
                System.out.println(this.getClass()+"我已經在跑了!");
            }
        }
        //調用在定義後面,謝謝。
        new Thread(new MyRun()).start();
    }
}           

或是這樣:

public class LeaningLamda2 {
    public static void main(String[] args) {
        
        class MyHi implements MyInterface{
            @Override
            public void sayHi() {
                System.out.println("ok ok ok ok ,i am say Hi!");
            }
        }
        new MyHi().sayHi();
    }
}
interface MyInterface{
    void sayHi();
}           

匿名内部類實作接口,使用方法

我就用一次,要什麼名字啊?能少輸入一個字元都是賺的。需要借助父類或者接口名來實作。

你看:

public class LeaningLamda{
    public static void main(String[] args) {
        
        //需要借助父類或者接口來聲明
        new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println(this.getClass()+"我已經在跑了!");
            }
        }).start();
    }
}           

又如:

public class LeaningLamda2 {
    public static void main(String[] args) {

        new MyInterface(){
            @Override
            public void sayHi() {
                System.out.println("ok ok ok ok ,i am say Hi!");
            }
        }.sayHi();
    }
}
interface MyInterface{
    void sayHi();
}           

使用lamda表達式的,實作方法

jdk 8 看不下去了,給我們提供了一個更加簡化的方案,你看:

lamda表達式實作建立單個簡單線程:

public class LeaningLamda{
    public static void main(String[] args) {
        
        new Thread(()-> {
                System.out.println("我已經在跑了!");
            }
        ).start();
    }
}           

lamda表達式sayHi:

public class LeaningLamda2 {
    public static void main(String[] args) {

        //此處需要借助一個父類或接口對象來存放,調用它
        MyInterface ls = ()->{  
            System.out.println("ok ok ok ok ,i am say Hi!"); };
        ls.sayHi();
    }
}
interface MyInterface{
    void sayHi();
}           

可帶參數

lamda表達式可以帶參數,可以不指定類型,它會自适應類型:

public class LeaningLamda2 {
    public static void main(String[] args) {

        MyInterface ls = (i,str)->{
            System.out.println("int:"+i);
            System.out.println("String:"+str);};

        ls.sayHi(520,"i love you!");
    }
}
interface MyInterface{
    void sayHi(int i,String str);
}           

運作結果:

隻有一個參數

那我括号都可以省了!

public class LeaningLamda2 {
    public static void main(String[] args) {
        MyInterface ls = str-> {System.out.println("String:"+str);};
        ls.sayHi("i love you!");
    }
}
interface MyInterface{
    void sayHi(String str);
}           

運作結果:

Java使用lamda表達式簡化代碼

有傳回值

如果有傳回值呢,正常傳回:

public class LeaningLamda2 {
    public static void main(String[] args) {

        MyInterface ls = (String str)-> {
            String str2 = "最後的赢家是:"+str;
            return str2;};
        System.out.println(ls.sayHi("lurenjia"));
    }
}
interface MyInterface{
    String sayHi(String str);
}           

隻有一條語句

如果方法隻有一條語句,那大括号也沒有必要,可以省略:

public class LeaningLamda2 {
    public static void main(String[] args) {

        MyInterface ls = (int i,String str)-> System.out.println("int:"+i+"----String:"+str);
        ls.sayHi(520,"i love you!");
    }
}
interface MyInterface{
    void sayHi(int i,String str);
}           

究極省略,不能再省了

就一條語句,是傳回值:

public class LeaningLamda2 {
    public static void main(String[] args) {

        MyInterface ls = str-> "最後的赢家是:"+str;
        System.out.println(ls.sayHi("中國"));
    }
}
interface MyInterface{
    String sayHi(String str);
}           

運作結果:

Java使用lamda表達式簡化代碼

lamda總結

常用于建立簡單線程。

1、接口隻有一個方法,可有參數,可有傳回值。

2、本方法内容簡單,使用較少。

3、基本形式為:

接口或父類   名稱  = (參數類型1 參數1,參數類型2 參數2,...)->{
            内容
        };
名稱.方法(參數1,參數2,...);           

4、可以省略的是:

1、lamada參數類型可省,它自适應。

2、方法内容隻有一條内容,大括号可省。

3、内容隻有一句傳回語句,return可省,直接寫值。