lamdba表达式

Posted yangfei629

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lamdba表达式相关的知识,希望对你有一定的参考价值。

1、lamdba有何用


java8出现了lamdba表达式,类似js的箭头函数。有何用?

看个例子 java8之前 一个List的排序,如下的写法是使用匿名类来实现Compartor接口

public static void main(String[] args)
        List<String> strList = Arrays.asList("yf1","yf2");
        strList.sort(new Comparator<String>() 
            @Override
            public int compare(String o1, String o2) 
                return o1.compareTo(o2);
            
        );
    

lamdba出现后 ,可以改成如下形式

public static void main(String[] args)
        List<String> strList = Arrays.asList("yf1","yf2");
        strList.sort((o1, o2) -> o1.compareTo(o2));
    

是否很简洁 可读性跟好。

  

2、如何使用lamdba表达式


基本语法,如下 

param -> expression

(param1,param2) -> expression

(type param1,type param2) -> expression

(param1,param2) -> statements;...

特点:

a. 省略了接口名称,方法。

b. 参数类型也不是必须的,可以省略

c. 单个语句可以省略 

d. 方法体内容,一般不建议有多行,3行以内

 

其中b c缺省的类型 java会在编译时 进行类型推断,根据上下文信息自动识别其类型

(java是强类型语言)

 

3、函数式接口


 

函数式接口 : 只有一个抽象方法的接口

只有函数式接口才可以使用lamdba表达式。

 

注意java8 可以定义有默认实现的方法,这个跟lamdba不冲突,看如下例子

定义函数式接口:

@FunctionalInterface
public interface LamInterface 
    void print(String name);
    default String getName()
        return "yf";
    

测试:

public class LamdbaYf 
    public static void testLamdbs(LamInterface lamInterface)
        lamInterface.print(lamInterface.getName());
    

    public static void main(String[] args)
        testLamdbs((name)->System.out.println("my name is = "+name));
    

输出:my name is = yf

 

4、@FunctionalInterface注解


这个注解标识此接口是函数式接口,如果不是,如定义了2个抽象方法。编译会提示报错的

 

但不是说函数式接口必须使用此注解,即使不使用@FunctionalInterface注解,功能依然不受影响。

 

5、lamdba表达式与匿名类区别


1、this的使用 

     匿名类实际还是一个类,在匿名类中使用this 表示的是这个匿名类实例本身。

     而在lamdba中使用this ,是指调用lamdba的类实例

2、lamdba是通过invokedynamic jvm虚拟机指令执行的

 

6、方法引用


TODO

以上是关于lamdba表达式的主要内容,如果未能解决你的问题,请参考以下文章

第二十一节——Lamdba表达式与函数式接口

一篇文章,让你对Lamdba表达式感到不在困难

Java8 Lamdba表达式 002

Java 8 新特性 lamdba表达式

Java8 新特性 Lamdba表达式的一些简单用法

一Lamdba表达式一篇足够