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);
}


去掉了参数类型、括号、花括号,结果依旧相同。

重写方法体中如有多行,仍需加上花括号。

多个参数时也可以去掉参数类型。

posted on 2021-10-22 20:37  菜小疯  阅读(2874)  评论(0编辑  收藏  举报