JDK1.8 新特性(一) Lambda表达式

1  为什么要学习Lambda表达式了?装B?写代码更吊?

都不是,比如你看一些源码的时候(很多源码都使用它了),有很多Lambda表达式

你又看不懂,怎么办,只有学习它,弄懂它,是吧?

为什么要用Lambda表达式了?

它使你的代码看起来更简洁,代码量更少..

其它的语言都引进了,作为第一语言的JAVA 为什么不引进了

2  Lambda表达式又叫函数式接口编程,函数式接口:顾名思义,

就是一个接口类,只有一个方法。举个简单例子:下面的线程

public static void main(String[] args) {
        // JDK7 匿名内部类写法
        new Thread(new Runnable(){
            @Override
            public void run() {
                System.out.println("jdk1.7的写法");
            }// 接口名

        }).start();

        // JDK1.8 lambda写法
        new Thread(()-> System.out.println("this is my jdk 1.8 + thread")).start();
    }

是不是更简单,本来要写几行代码的语句,一句就可以搞定,很炫吧。

那为什么能用Lambda表达式,其实是因为Runnable这个类,

这个接口类只有一个run()方法,并且被@FunctionalInterface(可无)注解,

下面看看有参数的Lambda,比较字符的

String[] players = {"zhansgan", "lisi", "wangwu", "zhaoliu",  "wangmazi"};

        // 1.1 使用匿名内部类根据 surname 排序 players
        Arrays.sort(players, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return (s1.compareTo(s2));
            }
        });

        Arrays.stream(players).forEach(a-> System.out.println(a));

        players = new String[]{"zhansgan", "lisi", "wangwu", "zhaoliu", "wangmazi"};

        // 1.2 使用 lambda 排序,根据 surname
        Arrays.sort(players, (String s1, String s2) ->  s1.compareTo(s2));

        Arrays.stream(players).forEach(a-> System.out.println(a));

能够使用Lambda的依据是必须有相应的函数接口(函数接口,是指内部只有一个抽象方法的接口)。

通过上面例子我们再来思考为什么Lambda表达式需要函数式接口?其实很简单目的就是为来保证唯一。

你的Runnable接口只要一个抽象方法,那么我用() -> System.out.println("Hello world !"),就只能代表run方法,如果你下面还有一个抽象方法,那我使用Lambda表达式,那鬼才知道要调用哪个抽象方法呢。

你也可以写自己的函数接口,一个接口实现一个抽象方法。自己试试呗

猜你喜欢

转载自blog.csdn.net/shrek11/article/details/103233617