JDK8的新特性 —— LambdaExpress


前言

LambdaExpress 是JDK8 加进去的,到目前为止各大厂都在广泛使用,它有着很强的优势:速度更快;代码更少;强大的流式API;便于并行。


一、LambdaExpress 是什么?

    基本概念 本质上它是一个匿名方法,即没有函数名的函数。 它是基于数学中的λ演算得名。 它的核心思想是将面向对象中的传递数据变成传递行为。 它可以表示闭包(此处要和数学传统意义上的闭包进行区分)。 规则 一定得是函数式接口。 接口中只能有一个方法。

二、使用方法

1.使用口诀

    拷贝小括号 写死右箭头 落地大括号

2.代码实例

1) 无返回值,无参数:

接口:Person

package com.juc.study.iServer;
/**
 * 接口 —— 人
 */
public interface Person {
          
   

    /**
     * 只有这一个说的方法
     */
    public void say();
}

测试代码:

import com.juc.study.iServer.Person;
import org.junit.Test;

public class TestJucStudy {
          
   

    @Test
    public void testLambdaExpress() {
          
   
        Person p = () -> {
          
   System.out.println("你好!!!");};
        p.say();
    }
}

执行结果:

你好!!!

2) 有参、有返回值

接口:Person

package com.juc.study.iServer;

/**
 * 接口 —— 人
 */
public interface Person {
          
   

    /**
     * 两个学科的总成绩
     * @param i
     * @param y
     * @return
     */
    public int totalScore(int i, int y);
}

测试代码:

import com.juc.study.iServer.Person;
import org.junit.Test;

public class TestJucStudy {
          
   
    @Test
    public void testLambdaExpress() {
          
   
        Person p = (int x, int y) -> {
          
   return x + y;};
        System.out.println(p.totalScore(90, 99));
    }
}

执行结果:

189

3、如何确保接口是函数式接口

    在接口上添加注解 @FunctionalInterface 。 如果接口中只有一个方法,JDK8 会在此接口上自动加上@FunctionalInterface ,俗称隐式定义。 如果接口中的方法超过一个,那JDK8就会认为它是一个普通的标准接口。 如果想强制让其成为函数式接口,就可以在接口上添加@FunctionalInterface 注解,当接口中添加了多个方法时就会报错。 JDK8里允许有一部分方法的实现,代码如下:

接口: Person

package com.juc.study.iServer;

/**
 * 接口 —— 人
 */
@FunctionalInterface
public interface Person {
          
   

    /**
     * 两个学科的总成绩
     * @param i
     * @param y
     * @return
     */
    public int totalScore(int i, int y);

    /**
     * 使用default关键字可以在接口中实现方法,也不会影响函数式接口的定义
     */
    public default void say() {
          
   
        System.out.println("Hello JAVA 8");
    }
    
	/**
     * 静态方法
     */
    public static void attr() {
          
   
        System.out.println("基本属性");
    }
}

测试代码:

import com.juc.study.iServer.Person;
import org.junit.Test;

public class TestJucStudy {
          
   

    @Test
    public void testLambdaExpress() {
          
   
        Person p = (int x, int y) -> {
          
   return x + y;};
        System.out.println(p.totalScore(90, 99));
        p.say();
        Person.attr();
    }
}

执行结果:

189
Hello JAVA 8
基本属性

使用default关键字可以在接口中实现方法,也不会影响函数式接口的定义,并且可以有多个; 也可以定义多个static 方法 。


三、总结

以上内容就是Lambda表达式的基本知识和用法,有兴趣的同学可以继续深入研究。

经验分享 程序员 微信小程序 职场和发展