Lambda 表达式

1、函数式编程思想 概述

	在数学中,函数就是有"输入量、输出量”的一套解决方案,也就是拿数据做操作,
	面向对象思想就是强调 “必须通过对象的形式做事情",
	而函数式思想尽量忽略面向对象的复杂语法,"强调做什么,而不是以什么形式去做“,
	这就是lambda函数表达式思想的体现

下面看一个需求,

1、自定义一个线程实现Runable接口
2、重写run方法
3、创建自定义线程对象,并将它传递给Thread的构造函数
4、启动线程

1.1 原始的方式实现

package com.hzbank.functionalInterface;

public class MyRunable  implements Runnable{
    @Override
    public void run() {
        System.out.println("获取线程中的值");
    }
}

1.2 创建测试类

package com.hzbank.functionalInterface;

public class TestFuncation {
    public static void main(String[] args) {
       MyRunable myThead=new MyRunable();
       Thread thread=new Thread(myThead);
       thread.start();
}
}

这是最原始的方式,我们必须要实现接口,然后创建实现类对象去操作,那么有没有办法去简化它呐?肯定是有的,比如我们常见的匿名内部类,我们无需去实现接口,就可以操作,如

package com.hzbank.functionalInterface;

public class TestFuncation {
    public static void main(String[] args) {
        //原始方式
      //MyRunable myThead=new MyRunable();
      //Thread thread=new Thread(myThead);
      //thread.start();
        
        Thread thread =new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类实现方式");
            }
        });
        thread.start();
    }
}

此时我们还可以优化,那么就是lambda表达式了

2、什么是Lambda表达式?
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)
语法:(形式参数) -> {代码块}
1、形式参数,如果有多个参数,参数之间用逗号隔开,没有参数就留空。
2、->英文中画线和大于符合组成,固定语法,代表指向动作
3、代码块,具体要做的事情,指的是方法体中的内容。
大致分为以下几个情况,我们逐一用lambda实现一下
2.1: 有一个参数无返回值

/**
 * 一个参数无返回值
 */
public interface NoReturnOneParam {
    public void method(String param);
}

2.2: 有一个参数有返回值

/**
 * 一个参数有返回值
 */
public interface OneReturnOneParam {
    public String method(String param);

}

2.3: 多个参数无返回值


/**
 * 多个参数无返回值
 */
public interface NoReturnMoreParam {
    public void method(String name,int age);
}

2.4: 多个参数有返回值


/**
 * 多个参数有返回值
 */
public interface MoreRetrunMoreParam {
    public String method(String name,int age);
}

2.5:无参数无返回值

/**
 * 没有参数没有返回值
 */
public interface NoReturnNoParam {
    public void method();
}

2.6:无参数有返回值


/**
 * 没有参数没有返回值
 */
public interface NoReturnNoParam {
    public void method();
}

2.6 编写测试类 测试一下

package com.hzbank.lambdas;

import java.util.UUID;

public class LambdaTest {
    //测试有一个参数,无返回值
    public void testNoReturnOneParam(NoReturnOneParam param) {
        param.method("陈晨");
    }

    //测试有一个参数,有返回值
    public String testOneReturnOneParam(OneReturnOneParam param) {
        return param.method("陈晨");
    }

    //多个参数无返回值
    public void testNoReturnMoreParam(NoReturnMoreParam param) {
        param.method("陈晨", 18);
    }

    //多个参数有返回值
    public String testMoreRetrunMoreParam(MoreRetrunMoreParam param) {
        return param.method("陈晨", 18);
    }

    //没有参数没有返回值
    public void testNoReturnNoParam(NoReturnNoParam param) {
        param.method();
    }

    //没有参数有返回值
    public String testMoreRetrunMoreParam(OneReturnNoParam param) {
        return param.method();
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest();
        lambdaTest.testNoReturnOneParam((String param) -> {
            System.out.println("测试有一个参数,无返回值" + "___参数:" + param);
        });
        System.out.println("..................................");

        lambdaTest.testOneReturnOneParam((String param) -> {
            System.out.println("测试有一个参数,有返回值" + "___参数:" + param + "___返回值:" + param);
            return param;
        });


        lambdaTest.testNoReturnMoreParam((String name, int age) -> {
            System.out.println("多个参数无返回值" + "___参数1:" + name + "___参数2:" + age);
        });

        lambdaTest.testMoreRetrunMoreParam((String name, int age) -> {
            System.out.println("多个参数有返回值" + "___参数1:" + name + "___参数2:" + age + "___返回值:" + "名称:" + name + "年龄:" + age);
            return "名称:" + name + "年龄:" + age;
        });

        lambdaTest.testNoReturnNoParam(() -> {
            System.out.println("没有参数没有返回值");
        });
         lambdaTest.testMoreRetrunMoreParam(() -> {
                System.out.println("没有参数有返回值"
                        + "___返回值:" + UUID.randomUUID().toString());
                return UUID.randomUUID().toString();
            });
    }
}

lambda表达式有几个省略规则:
1、参数类型可以省略,但在多参数的时候,不能只省略一个参数的类型(就是要么全部省略,要么都不省略)。
2、如果参数只有一个,小括号可以省略。
3、如果代码块只有一条,可以省略大括号和分号,以及return关键字。
再次优化测试类

package com.hzbank.lambdas;

import java.util.UUID;

public class LambdaTest {
    //测试有一个参数,无返回值
    public void testNoReturnOneParam(NoReturnOneParam param) {
        param.method("陈晨");
    }

    //测试有一个参数,有返回值
    public String testOneReturnOneParam(OneReturnOneParam param) {
        return param.method("陈晨");
    }

    //多个参数无返回值
    public void testNoReturnMoreParam(NoReturnMoreParam param) {
        param.method("陈晨", 18);
    }

    //多个参数有返回值
    public String testMoreRetrunMoreParam(MoreRetrunMoreParam param) {
        return param.method("陈晨", 18);
    }

    //没有参数没有返回值
    public void testNoReturnNoParam(NoReturnNoParam param) {
        param.method();
    }

    //没有参数有返回值
    public String testMoreRetrunMoreParam(OneReturnNoParam param) {
        return param.method();
    }

    public static void main(String[] args) {
        LambdaTest lambdaTest = new LambdaTest();
        //lambdaTest.testNoReturnOneParam((String param) -> {
        //    System.out.println("测试有一个参数,无返回值" + "___参数:" + param);
        //});

        //简化版,一个参数省略参数类型,省略小括号,主体包含一个语句,省略大括号
        lambdaTest.testNoReturnOneParam(param ->
                System.out.println("测试有一个参数,无返回值" + "___参数:" + param));

        System.out.println("..................................");

//        lambdaTest.testOneReturnOneParam((String param) -> {
//            System.out.println("测试有一个参数,有返回值" + "___参数:" + param + "___返回值:" + param);
//            return param;
//        });

        lambdaTest.testOneReturnOneParam(param -> param
                // System.out.println("测试有一个参数,有返回值" + "___参数:" + param + "___返回值:" + param);
        );

        //lambdaTest.testNoReturnMoreParam((String name, int age) -> {
        //    System.out.println("多个参数无返回值" + "___参数1:" + name + "___参数2:" + age);
        //});
        //简化版 多个参数不可省略小括号,但主体包含一个语句,省略大括号,省略参数类型
        lambdaTest.testNoReturnMoreParam((name,age) -> System.out.println("多个参数无返回值" + "___参数1:" + name + "___参数2:" + age)
        );

        //lambdaTest.testMoreRetrunMoreParam((String name, int age) -> {
        //    System.out.println("多个参数有返回值" + "___参数1:" + name + "___参数2:" + age + "___返回值:" + "名称:" + name + "年龄:" + age);
        //    return "名称:" + name + "年龄:" + age;
        //});

        //简化版,省略参数类型,主体包含一个语句,省略大括号,省略return
        lambdaTest.testMoreRetrunMoreParam((name, age) -> "名称:" + name + "年龄:" + age);

        //
        // lambdaTest.testNoReturnNoParam(() -> {
        //     System.out.println("没有参数没有返回值");

        // });
        //简化版:
        lambdaTest.testNoReturnNoParam(() -> {});

        lambdaTest.testMoreRetrunMoreParam(() -> {
            System.out.println("没有参数有返回值"
                    + "___返回值:" + UUID.randomUUID().toString());
            return UUID.randomUUID().toString();
        });
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值