首页 > 编程语言 >Java Lambda 表达式

Java Lambda 表达式

时间:2022-11-11 10:33:42浏览次数:35  
标签:Java int void MathOperation operation public 表达式 Lambda


目录

  • ​​一、说明​​
  • ​​二、理解​​
  • ​​三、演示​​
  • ​​1.常规方法实现​​
  • ​​2.静态内部类​​
  • ​​3.局部内部类​​
  • ​​4.匿名内部类​​
  • ​​5.Lambda表达式​​
  • ​​6.Lambda再简化​​

一、说明

Lambda表达式是什么

  • Lambda 表达式也称为闭包,是Java 8 发布的新特性
  • Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)

为什么要使用Lambda表达式

  • 避免匿名内部类定义过多,可以让代码简洁紧凑,留下核心的逻辑

二、理解

语法格式

(parameters) -> expression[表达式]
(parameters) -> statements[语句]
(parameters) ->{ statements; }

函数式接口

Functional lnterface(函数式接口)是指任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口,可以通过Lambda表达式创建该接口的对象

public interface Runnable {
public abstract void run();
}

特征

  • 可省略类型声明:不需要声明形式参数类型
  • 可省略参数括号:一个参数无需定义括号,但多个参数需要定义括号
  • 可省略花括号:如果主体只包含了一个语句就不需要使用花括号
  • 可省略返回关键字:如果主体只包含了一个返回值语句则会自动返回

三、演示

1.常规方法实现

正常情况下的实现加法函数计算,需要定义接口并实现类,再调用方法,在此基础上不断简化,去深入理解Lambda 表达式是如果做到的

Java Lambda 表达式_内部类

public class LambdaDemo {

public static void main(String[] args) {
//3.执行计算
MathOperation addition = new Addition();
addition.operation(1,2);
}
}
//1.定义一个函数式接口方法
interface MathOperation{
void operation(int a, int b);
}
//2.定义实现类
class Addition implements MathOperation{
@Override
public void operation(int a, int b) {
System.out.println(a + b);
}
}

2.静态内部类

进一步改进使得代码更紧凑,实现静态内部类,也就是将实现类放入主类中,会提示我们需要定义静态类

Java Lambda 表达式_正则表达式_02


Java Lambda 表达式_内部类_03

public class LambdaDemo {
//2.实现静态内部类
static class Addition implements MathOperation{
@Override
public void operation(int a, int b) {
System.out.println(a + b);
}
}
public static void main(String[] args) {
//3.执行计算
MathOperation addition = new Addition();
addition.operation(1,2);
}
}
//1.定义一个函数式接口
interface MathOperation{
void operation(int a, int b);
}

3.局部内部类

可是静态内部类还是太繁琐了,如果把它放进方法里面呢?由此引出局部内部类,即在一个方法中定义的内部类,这时就不用定义静态类了

Java Lambda 表达式_匿名内部类_04

public class LambdaDemo {
public static void main(String[] args) {
//2.实现局部内部类
class Addition implements MathOperation{
@Override
public void operation(int a, int b) {
System.out.println(a + b);
}
}
//3.执行计算
MathOperation addition = new Addition();
addition.operation(1,2);
}
}
//1.定义一个函数式接口
interface MathOperation{
void operation(int a, int b);
}

4.匿名内部类

局部内部类还是感觉代码太多了,如果简化呢?比如把类名隐藏?匿名内部类就是没有名字的内部类,其必须实现接口或抽象父类的所有抽象方法

Java Lambda 表达式_函数式接口_05

public class LambdaDemo {
public static void main(String[] args) {
//2.实现匿名内部类,实现接口,直接执行计算
new MathOperation(){
@Override
public void operation(int a, int b) {
System.out.println(a + b);
}
}.operation(1, 2);
}
}
//1.定义一个函数式接口
interface MathOperation{
void operation(int a, int b);
}

Java Lambda 表达式_函数式接口_06

public class LambdaDemo {
public static void main(String[] args) {
//2.实现匿名内部类,实现接口
MathOperation addition = new MathOperation() {
@Override
public void operation(int a, int b) {
System.out.println(a + b);
}
};
//3.执行计算
addition.operation(1,2);
}
}
//1.定义一个函数式接口
interface MathOperation{
void operation(int a, int b);
}

5.Lambda表达式

都已经没有类名了,能否再简化呢?用Lambda试试,因为接口中只有一个方法,方法中只有一块语句,因此可以省略接口和方法,只留下语句实现

Java Lambda 表达式_正则表达式_07

public class LambdaDemo {
public static void main(String[] args) {
//2.Lambda简化,只有一块语句,省略接口和方法,只留下语句实现
MathOperation addition = (int a , int b) -> {
System.out.println(a + b);
};
//3.执行计算
addition.operation(1, 2);
}
}
//1.定义一个函数式接口
interface MathOperation{
void operation(int a, int b);
}

6.Lambda再简化

Lambda 表达式还可以省略参数类型,因为一行语句,因此可以省略花括号

Java Lambda 表达式_正则表达式_08

public class LambdaDemo {
public static void main(String[] args) {
//2.Lambda简化,省略参数类型,代码块只有一句,可以省略花括号
MathOperation addition = (a , b) -> System.out.println(a + b);
//3.执行计算
addition.operation(1,2);
}
}
//1.定义一个函数式接口
interface MathOperation{
void operation(int a, int b);
}


标签:Java,int,void,MathOperation,operation,public,表达式,Lambda
From: https://blog.51cto.com/u_15872973/5843053

相关文章

  • Java多线程 Callable和Future
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.实现接口​​​​2.执行线程​​一、说明Java提供了三种创建线程的方法实现​​Runnable​​接口继承​​T......
  • Java多线程 Future和FutureTask的区别
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.实现接口​​​​2.使用Future​​​​3.使用FutureTask​​一、说明Future和FutureTask的关系Future是一个......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.AbortPolicy​​​​2.DiscardPolicy​​​​3.DiscardOldestPolicy​​​​4.CallerRunsPolicy​​​​5.自......
  • Java多线程 线程池Executor框架
    目录​​一、说明​​​​二、理解​​​​Executor​​​​ExecutorService​​​​Executors​​​​三、实现​​​​1.newSingleThreadExecutor​​​​2.newFixedThr......
  • 8:Spring MVC-Java Spring
    目录​​8.1WEB开发模式一​​​​8.2WEB开发模式二​​​​8.3SpringMVC介绍​​​​8.4SpringMVC主要组件​​​​8.5SpringMVC处理流程​​​​8.6SpringMVC的......
  • Java Web项目中使用RSA加密数据
    在Web项目中有些时候需要对传输的数据加密后再传输到服务端进行解密使用,这里采用RSA进行公钥加密私钥解密的模式会有较高的安全性。这里选用的工具库是 JSEncrypt.js ......
  • 硬核剖析Java锁底层AQS源码,深入理解底层架构设计
    我们常见的并发锁ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier都是基于AQS实现的,所以说不懂AQS实现原理的,就不能说了解Java锁。上篇文章讲了AQS的加锁流程,这......
  • [题解] [CSP-J 2022] 逻辑表达式 思路整理
    标签:分治。题目传送门:P8815[CSP-J2022]逻辑表达式题目大意给一个包含0、1、|、&、(、)的逻辑表达式(保证正确)。在计算表达式时采用“短路”策略:计算表达式a&b......
  • Java并发编程——基础知识(一)
    1.进程与线程1.1基本概念进程:对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发线程:进程的子任务,是CPU调度和分派的基本单位,用于保证程序......
  • Java组合异步编程(2)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 多数码农在开发的时候,要么处理同步应用,要么处理异步。但是如果能学会使用CompletableFuture,就会具备一种神奇的能力:将同......