美文网首页
Lambda表达式和匿名内部类-001

Lambda表达式和匿名内部类-001

作者: 小尾巴1024 | 来源:发表于2019-01-03 20:05 被阅读0次

前言

Java Lambda表达式是匿名内部类的语法糖,它可以简化和取代匿名内部类,JVM内部是通过invokedynamic指令来实现Lambda表达式。

取代某些匿名内部类

无参数函数的写法,在Java7中,如果要创建一个线程,通常如下:

new Thread(new Runnable(){// 接口名
    @Override
    public void run(){// 方法名
        //dosomething...
    }
}).start();

如果使用Lambda表达式,可以简写成下面形式:省去了接口名和方法名

new Thread(()->{
    //dosomething...
})

带参数函数的写法,在Java7中,如下:

List<String> list = Arrays.asList("This", "is", "my", "world");
Collections.sort(list, new Comparator<String>(){// 接口名
    @Override
    public int compare(String s1, String s2){// 方法名
        if(s1 == null)
            return -1;
        if(s2 == null)
            return 1;
        return s1.length()-s2.length();
    }
});

使用Lambda表达式,如下:

List<String> list = Arrays.asList("This", "is", "my", "world");
Collections.sort(list, (s1,s2)->{
  if(s1 == null)
            return -1;
        if(s2 == null)
            return 1;
        return s1.length()-s2.length();
})

上面两个例子可以看出,要使用Lambda表达式代替匿名内部类,必须有函数接口,也就是説不在随便在任何地方使用Lambda表达式。
实际上Java8中新引入了函数接口的概念,函数接口是指内部只有一个函数的接口。
另外Lambda表达式另一个依据是类型推断机制,在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名。像上面的例子2,不需要指定s1和s2的类型,Lambda表达式根据上下文会推断出来 。

自定义函数接口

自定义函数接口很容易,只需要编写一个只有一个抽象方法的接口即可。如下:

// 自定义函数接口
@FunctionalInterface
public interface ConsumerInterface<T>{
    void accept(T t);
}
//使用自定义函数接口
class MyDemo<T>{
    private List<T> list;
    public void each(ConsumerInterface<T> consumer){// 1
        for(T t : list){
            consumer.accept(t);
        }
    }
}
MyDemo<String> stream = new MyDemo<String>();
stream.each(str -> System.out.println(str));   // 使用自定义函数接口书写Lambda表达式

参考:
http://www.cnblogs.com/CarpenterLee/p/5978721.html
http://www.runoob.com/java/java8-lambda-expressions.html

相关文章

  • 2020-07-04【Lambda】

    Lambda标准格式 Lambda省略模式 Lambda注意事项 Lambda表达式和匿名内部类的区别

  • Kotlin之Lambda表达式和成员引用

    Lambda介绍:作为函数参数的代码块 用匿名内部类实现监听器 现在用Kotlin的Lambda表达式来替换匿名内...

  • Java8 Lambda表达式

    1.替代匿名内部类 使用匿名内部类 使用lambda表达式 2.使用lambda表达式对集合进行迭代 3.使用la...

  • Lambda表达式

    本章节主要介绍lambda表达式简化匿名内部类的写法,但lambda表达式不能取代所有的匿名内部类,只能用来取代函...

  • Lambda

    Lambda表达式 Lambda表达式其实是一个匿名函数,是对匿名内部类的一种简化 Lambda表达式是函数式编程...

  • 《深入理解Java函数式编程》系列文章

    《深入理解Java函数式编程》系列文章 目录 Lambda表达式和匿名内部类(I),展示如何使用Lambda表达式...

  • Lambda表达式和匿名内部类-001

    前言 Java Lambda表达式是匿名内部类的语法糖,它可以简化和取代匿名内部类,JVM内部是通过invoked...

  • Java 8新特性

    Lambda表达式与Functional接口 Lambda表达式 可以认为是一种特殊的匿名内部类lambda只能用...

  • Lambda表达式-03-02

    外部类实现线程接口: 内部类实现线程接口: 匿名内部类: jdk8的Lambda表达式:

  • Lambda表达式和函数式接口

    初识lambda表达式 lambda表达式是Java8的新特性,可以将lambda表达式看成是精简语法的匿名内部类...

网友评论

      本文标题:Lambda表达式和匿名内部类-001

      本文链接:https://www.haomeiwen.com/subject/lsmfrqtx.html