java8特性 - lambda表达式

java8特性 - Lambda


一、Lambda表达式

  • 函数式接口

Lambda表达式使用的前提,就是接口必须是一个函数式接口

定义

如果在接口中,只有一个抽象方法,那么这个接口就是函数式接口。

格式

使用注解来检查当前接口是否是一个函数式接口

@FunctionalInterface

​ 如果不是函数式接口,则编译报错。

作用

主要用于函数式编程(即使用lambda表达式编程)。

@FunctionalInterface
interface Inter1{
    // 有且只能有一个抽象方法
	void test1();
    // 其它方法,
}

  • Lambda作用

Lambda表达式作用就是简化匿名内部类。


1. Lambda语法

**语法格式1:**没有参数,也没有返回值

() -> System.out.println(“xxyy”); // 右边是方法体

**语法格式2:**有一个参数,没有返回值

(x) -> System.out.println(x * x);

说明:如果只有一个参数,那么小括号可以省略

**语法格式3:**有多个参数,没有返回值,格式和语法格式2相同

(x, y) -> System.out.println(x + y);

**语法格式4:**接口中需要重写的方法,方法内容有多句,需要给多句话加上大括号

(x, y) -> {int result = x + y; return result;}

示例代码

// 定义函数式接口,无参数无返回值
interface MyInter1{
	void sayHello();
}
// 定义函数式接口,有一个参数,无返回值
interface MyInter2{
	void introduce(String name);
}
// 定义函数式接口,有两个参数,无返回值
interface MyInter3{
	
	void test3(int x,int y); 
}
// 定义函数式接口,有参数,有返回值
interface MyInter4{
	int add(int a,int b);
}
public class LambdaTest {

    // 无参无返回值
    @Test
    public static void test1(){
        //使用匿名内部类方式
        MyInter1 i1 = new MyInter1(){
            public void sayHello() {
                System.out.println("hello");
            }
        };
        i1.sayHello();

        //使用Lambda表达式
        MyInter1 i2 = ()->System.out.println("hello lambda");
        i2.sayHello();
    }

    // 有一个参数,无返回值
    @Test
    public static void test2(){
        // 匿名内部类方式
        MyInter2 i1 = new MyInter2(){
            public void introduce(String name) {
                System.out.println("大家好,我是: "+name);
            }
        };
        i1.introduce("张根硕");

        //使用Lambda表达式,可以省略小括号
        MyInter2 i2 = name-> System.out.println("Lambda:大家好,我是: "+name);
        i2.introduce("张无忌");
    }

    // 无返回值,有多个参数
    @Test
    public static void test3(){

        // 匿名内部类方式
        MyInter3 i1 = new MyInter3(){
            public void test3(int x, int y) {
                System.out.println(x-y);
            }
        };
        i1.test3(100,90);

        // Lambda表达式方式,不能省略小括号
        MyInter3 i2 = (a,b)->System.out.println(a-b);
        i2.test3(200, 90);

    }

    // 有参数有返回值
    @Test
    public static void test4(){

        // 匿名内部类方式
        MyInter4 i1 = new MyInter4() {
            public int add(int a, int b) {
                int result = a+b;
                return result;
            }
        };
        System.out.println(i1.add(1,2));


        //Lambda表达式方式
        //MyInter4 i2 = (x,y)->{int result = x+y;return result;};
        MyInter4 i2 = (x,y)->x+y;
        System.out.println(i2.add(10, 20));
    }
}

2. 方法引用

所谓的方法引用,就是在特殊的方法调用时有特殊的语法,相当于简化代码

格式

  • 函数式接口 名称 = 对象名 :: 方法名称 普通方法引用
  • 函数式接口 名称 = 类名 :: 静态方法名 静态方法引用
  • 函数式接口 名称 = 类名::new 构造方法引用

示例代码

@FunctionalInterface
public interface MyInter1 {

    // 求两个数的和
    int sum(int a, int b);
}

@FunctionalInterface
public interface MyInter2 {
    // 返回一个对象
    User user();
}
// 求两个和的工具类,非静态方法
public class MathUtil {

   // 普通方法,求两个数的和,需要对象调用
    public int sum1(int a, int b) {
        return a + b;
    }

    // 静态方法,求两个数的和,类名直接调用
    public static int sum2(int a, int b) {
        return a + b;
    }
}
// 测试代码
@Test
public void test1() {
// 静态方法引用
MyInter1 myInter1 =MathUtil::sum2;
    int sum = myInter1.sum(1, 2);
    System.out.println(sum);
}

@Test
public void test2() {
// 普通方法引用
MyInter1 myInter1 =new MathUtil()::sum1;
    int sum = myInter1.sum(1, 2);
    System.out.println(sum);
}

@Test
public void test3() {
// 构造方法引用
MyInter2 myInter2 = User::new;
    User user = myInter2.user();
    System.out.println(user);
}

完结,撒花! 感谢点赞 IT交流WX: c_-j_-c

你可能感兴趣的:(java,java-ee)