都2023年了,如果不会Lambda表达式、函数式编程?你确定能看懂公司代码?

简介: 都2023年了,如果你不会Lambda表达式、函数式编程?你确定能看懂公司代码? 那么建议来了解一下Lambda表达式, 因为它使用简单,易操作,易上手而代码简洁,开发快速,一看就令人很爽😎😎😎 . 其实Lambda表达式接近自然语言,易于理解 , 集万千优点与一身, 比匿名内部类更加完美👉👉👉.下面来简单认识一下今天的主角Lambda表达式吧

👳我亲爱的各位大佬们好😘😘😘
♨️本篇文章记录的为 Lambda表达式 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。
♨️如果文章有什么需要改进的地方还请大佬不吝赐教❤️🧡💛
👨‍🔧 个人主页 : 阿千弟

都2023年了,如果你不会Lambda表达式、函数式编程?你确定能看懂公司代码? 那么建议来了解一下Lambda表达式, 因为它使用简单,易操作,易上手而代码简洁,开发快速,一看就令人很爽😎😎😎 .
其实Lambda表达式接近自然语言,易于理解 , 集万千优点与一身, 比匿名内部类更加完美👉👉👉.下面来简单认识一下今天的主角Lambda表达式吧

在这里插入图片描述

1.2 函数式编程思想

1.2.1 概念

面向对象思想需要关注用什么对象完成什么事情。而函数式编程思想就类似于我们数学中的函数。它主要关注的是对数据进行了什么操作。

1.2.2 优点

  • 代码简洁,开发快速
  • 接近自然语言,易于理解
  • 易于"并发编程"

2. Lambda表达式

2.1 概述

Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。

2.2 核心原则

可推导可省略

2.3 基本格式

  • (参数列表)->{代码}
  • ()括号用来描述参数列表。
  • {}大括号用来描述方法体。
  • ->尖括号,Lambda运算符,可以叫做箭头符号,或者goes to。

2.4 使用场景

什么情况下使用lambda简化 :

如果这个匿名内部类是个接口,并且它当中只有一个抽象方法需要重写

lambda只关注你重写方法的参数列表以及方法体

在这里插入图片描述

例一

我们在创建线程并启动时可以使用匿名内部类的写法:

new Thread(new Runnable() {
   
   
    @Override
    public void run() {
   
   
        System.out.println("线程创建成功");
    }
}).start();

可以使用Lambda的格式对其进行修改。修改后如下:

new Thread(()->{
   
   
    System.out.println("线程创建成功");
}).start();

例二

现有方法定义如下,其中IntBinaryOperator是一个接口。先使用匿名内部类的写法调用该方法。

在这里插入图片描述

注意:

  • 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
  • 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。
 public static int calculateNum(IntBinaryOperator operator){
   
   
        int a = 10;
        int b = 20;
        return operator.applyAsInt(a, b);
    }

    public static void main(String[] args) {
   
   
        int i = calculateNum(new IntBinaryOperator() {
   
   
            @Override
            public int applyAsInt(int left, int right) {
   
   
                return left + right;
            }
        });
        System.out.println(i);
    }

Lambda写法:

 public static int calculateNum(IntBinaryOperator operator){
   
   
        int a = 10;
        int b = 20;
        return operator.applyAsInt(a, b);
    }

  public static void main(String[] args) {
   
   
        int i = calculateNum((int left, int right)->{
   
   
            return left + right;
        });
           //甚至可以这样写, 后面会为什么
           int i = calculateNum((left, right) -> left + right);

        System.out.println(i);
    }

在这里插入图片描述

例三

现有方法定义如下,其中IntPredicate是一个接口。先使用匿名内部类的写法调用该方法。

    public static void main(String[] args) {
   
   
        printNum(new IntPredicate() {
   
   
            @Override
            public boolean test(int value) {
   
   
                return value%2==0;
            }
        });
    }

    public static void printNum(IntPredicate predicate){
   
   
        int[] arr = {
   
   1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
   
   
            if(predicate.test(i)){
   
   
                System.out.println(i);
            }
        }
    }

Lambda写法:

public static void main(String[] args) {
   
   
        printNum((int value)-> {
   
   
            return value%2==0;
        });
    }
    public static void printNum(IntPredicate predicate){
   
   
        int[] arr = {
   
   1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
   
   
            if(predicate.test(i)){
   
   
                System.out.println(i);
            }
        }
    }

例四

现有方法定义如下,其中Function是一个接口。先使用匿名内部类的写法调用该方法。
在这里插入图片描述

Function<T, R>这个接口有点意思 , 它接收的泛型是<T, R>, 它只有一个抽象方法 R apply< T t >, 可以看出apply方法是接收T类型的参数, 转化为R类型并返回(T, R的类型任意, 前提是可以相互转化)

 public static <R> R typeConver(Function<String,R> function){
   
   
        String str = "1235";
        R result = function.apply(str);
        return result;
    }

    public static void main(String[] args) {
   
   
        Integer result = typeConver(new Function<String, Integer>() {
   
   
            @Override
            public Integer apply(String s) {
   
   
                return Integer.valueOf(s);
            }
        });
        System.out.println(result);
    }

Lambda写法:

public static <R> R typeConver(Function<String,R> function){
   
   
        String str = "1235";
        R result = function.apply(str);
        return result;
    }

    public static void main(String[] args) {
   
   
        Integer result = typeConver(s -> Integer.valueOf(s));
        System.out.println(result);
    }

省略的几种情况:

  • 可选类型声明 : 参数类型可以省略(编译器可以统一识别参数值)
    • 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
    • 方法只有一个参数时小括号可以省略
      在这里插入图片描述

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对Java后端或者对spring感兴趣的朋友,请多多关注💖💖💖
👨‍🔧 个人主页 : 阿千弟

目录
相关文章
|
SQL Java 关系型数据库
Java面向对象编程(15)
Java面向对象编程(15)
48 0
|
存储 缓存 Java
Java面向对象编程(31)
Java面向对象编程(31)
50 0
|
7月前
|
存储 Java
滚雪球学Java(41):Lambda表达式和方法引用:提高代码可读性和简洁性的神器
【5月更文挑战第16天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
62 2
滚雪球学Java(41):Lambda表达式和方法引用:提高代码可读性和简洁性的神器
|
存储 算法 Java
Java面向对象编程(4)
Java面向对象编程(4)
61 0
|
7月前
|
设计模式 Java 程序员
为什么程序员喜欢用Lambda表达式?
“lambda 表达式”是一段可以传递的代码,因此它可以被执行一次或多次。在学习语法(甚至包括一些奇怪的术语)之前,我们先回顾一下之前在Java 中一直使用的相似的代码块。
64 0
|
7月前
|
分布式计算 Java API
谈谈代码:函数式编程
一个风和日丽的下午,我看着日常看代码做重构迁移,突然看到这么段代码...
78 1
|
7月前
|
设计模式 Java 开发者
Java面向对象编程
Java面向对象编程
38 1
|
存储 搜索推荐 Java
Java面向对象编程(20)
Java面向对象编程(20)
40 0
|
SQL JavaScript 前端开发
Java面向对象编程(3)
Java面向对象编程(3)
45 0
|
算法 Java
Java面向对象编程(24)
Java面向对象编程(24)
48 0