首页 > 其他分享 >Lambda表达式

Lambda表达式

时间:2024-08-14 16:08:41浏览次数:9  
标签:String void new Lambda public 表达式 lambda

Lambda表达式

目录

什么是 lambda 表达式

lambda 表达式(拉姆达表达式)是 JAVA 8 中提供的一种新的特性,它使 Java 也能进行简单的“函数式编程”。

lambda 表达式的本质就是一个匿名方法(即没有方法名的方法)

lambda 表达式使用案例

使用 lambda 表达式实现 Runnable

package com.lambda;

/**
 * 使用lambda表达式替换Runnable匿名内部类
 * @author MingChenchen
 *
 */
public class RunableTest {
    /**
     * 普通的 Runnable
     */
    public static void runSomeThing(){

        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                System.out.println("I am running");
            }
        };
        new Thread(runnable).start();
    }

    /**
     * 使用lambda后的
     */
    public static void runSomeThingByLambda(){
        new Thread(() -> System.out.println("I am running")).start();
    }

    public static void main(String[] args) {
        runSomeThing();
//      runSomeThingByLambda();
    }
}

上述代码中 () -> System.out.println("I am running")就是一个lambda表达式,可以看出,它是替代了new Runnable(){}这个匿名内部类。

使用 lambda表达式 实现 Comparator

package com.lambda;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class SortList {
    //给入一个List
    private static List<String> list = 
            Arrays.asList("my","name","is","uber","and","uc");

    /**
     * 对一个String的list进行排序 - 使用老方法
     */
    public static void oldSort(){
        //排序
        Collections.sort(list,new Comparator<String>() {
            //使用新的排序规则 根据第二个字符进行逆序排
            @Override
            public int compare(String a,String b){
                if (a.charAt(1) <= b.charAt(1)) {
                    return 1;
                }else{
                    return -1;
                }
            }
        });
    }

    /**
     * 新的排序方法 - 使用lambda表达式实现
     */
    public static void newSort(){
        //lambda会自动推断出 a,b 的类型
        Collections.sort(list, (a, b) -> a.charAt(1) < b.charAt(1) ? 1:-1);
    }

    public static void main(String[] args) {
//      oldSort();
        newSort();
    }
}

使用 lambda 表达式实现 ActionListener

package com.lambda;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class ActionEventDemo {
    private JButton button = new JButton();


    public void bindEvent(){
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("你好!" );

            }
        });
    }

    /**
     * 使用Lambda表达式 为button添加ActionListener
     */
    public void bindEventByLambda(){
        button.addActionListener(e -> System.out.println("你好!"));
    }
}

lambda 表达式的由来

通过上述的几个例子,大家差不多也能明白了 lambda 表达式是用来干什么以及好处了。

显而易见的,好处就是代码量大大减少了!程序逻辑也很清晰明了。

它的用处浅显来说就是替代“内部匿名类”、可以对集合或者数组进行循环操作。

因此,JDK 8 中就提供了这种 lambda 表达式,供我们来更加简明扼要的实现内部匿名类的功能。

何时使用 lambda 表达式

lambda 表达式的本质是一个匿名方法,那就是说当你只需要一个能做一件事情的方法而已,连方法叫什么名字都无关紧要,Lambda 表达式就可以用来做这件事。

lambda 表达式语法

基本语法:
(参数) -> 表达式

(参数) -> { 代码块; }

//1. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y;

//2. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s);

lambda 表达式特性

类型推导

编译器负责推导lambda表达式的类型。它利用lambda表达式所在上下文所期待的类型进行推导,
这个被期待的类型被称为目标类型。就是说我们传入的参数可以无需写类型了!

变量捕获

在Java SE 7中,编译器对内部类中引用的外部变量(即捕获的变量)要求非常严格:
如果捕获的变量没有被声明为final就会产生一个编译错误。
我们现在放宽了这个限制——对于lambda表达式和内部类,
我们允许在其中捕获那些符合有效只读(Effectively final)的局部变量。

简单的说,如果一个局部变量在初始化后从未被修改过,那么它就符合有效只读的要求,
换句话说,加上final后也不会导致编译错误的局部变量就是有效只读变量。

注意:此处和final关键字一样,指的是引用不可改!(感觉没多大意义,还不是用的final)

方法引用

如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。
Comparator byName = Comparator.comparing(Person::getName);
此处无需再传入参数,lambda会自动装配成Person类型进来然后执行getName()方法,而后返回getName()的String

方法引用有很多种,它们的语法如下:
静态方法引用:ClassName::methodName
实例上的实例方法引用:instanceReference::methodName
超类上的实例方法引用:super::methodName
类型上的实例方法引用:ClassName::methodName
构造方法引用:Class::new
数组构造方法引用:TypeName[]::new

JAVA提供给我们的SAM接口

Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:

Predicate——接收T对象并返回boolean
Consumer——接收T对象,不返回值
Function<T, R>——接收T对象,返回R对象
Supplier——提供T对象(例如工厂),不接收值
UnaryOperator——接收T对象,返回T对象
BinaryOperator——接收两个T对象,返回T对象

那么在参数为这些接口的地方,我们就可以直接使用 lambda 表达式了!

lambda 表达式优缺点

优点

  • 极大的简化代码,去除了很多无用的 Java 代码,使得代码更为简洁明了

缺点

  • 可读性差。在代码简洁的情况下,另一方面又让大多程序员很难读懂。因为很少程序员接触使用它。 (不过这个缺点不是本身缺点,而且源于程序员较少使用)

标签:String,void,new,Lambda,public,表达式,lambda
From: https://www.cnblogs.com/luoyiwen123/p/18359169

相关文章

  • vue ---- {{}}插值表达式数据绑定
    数据绑定常用有4种方式:{{}}、v-text、v-html、template{{}}数据绑定最常见的形式就是使用“Mustache”语法(双大括号)的文本插值:<span>message:{{msg}}</span>mustache标签会被替代为对应数据对象航msgproperty的值。无论何时,绑定的数据对象msgproperty发生了改变,插值处的......
  • AWS Lambda 十年回顾:功能总览、更新记录与入门指南
    这次,我为2014年11月发布的AWSLambda创建了一个历史时间表。AWSLambda是一项无服务器、全托管的代码执行服务,今年2024年11月将迎来其宣布发布的十周年纪念。虽然提前了一些,但为了提前庆祝这一重要时刻,我写了这篇文章。文章中,我从AWSLambda的诞生到功能的增加和更新进行了追......
  • 正则表达式高级
    正则表达式的三种模式【贪婪、勉强、侵占】假定要分析的字符串是xfooxxxxxxfoo模式.*foo(贪婪模式):模式分为子模式p1(.*)和子模式p2(foo)两个部分.其中p1中的量词匹配方式使用默认方式(贪婪型)。匹配开始时,吃入所有字符xfooxxxxxx去匹配子模式p1。匹配成功,但这样以来就没......
  • Lambda表达式
    [Lang]Lambda表达式1.Lambda表达式的语法[capture](parameters)->return_type{body};capture:捕获外部作用域变量的方式。parameters:参数列表,类似于普通函数。->return_type(可选):返回类型。如果省略,编译器会自动推断。body:函数体,包含需要执行的代码。2.Lambd......
  • 提高效率:Linux 正则表达式实用技巧
    目录前言匹配符号用法讲解“.”用法[]用法“*”用法“.*”用法“\?”用法“\+”用法“\\{n\\}”用法\\{m,n\\}用法锚点符号“^”用法“$”用法“^$”用法或|用法前言在Linux系统中,正则表达式(RegularExpressions,简称regex)是一个强大的工具,广泛应......
  • 表达式目录树
    1.表达式目录树和委托的类比:表达式目录树是一种数据结构、是一种语法树,可以被我们解析: 2.表示式目录树的使用场景:把一个对象中的数据赋值到另一个对象当中:实现对象值赋值:一.反射: 二.序列化器: 三.使用表达式目录树4.使用泛型缓存+表达式目录树 调用如下: 5.Exp......
  • C++ 11 auto(自动类型推导) 和 decltype(获取表达式类型)
    C++(2)auto占位符自动类型推导auto能够实现类型的自我推导,并不代表一个实际的类型声明。auto只是一个类型声明的占位符。auto声明的变量,必须马上初始化,以让编译器推断出它的实际类型,并在编译时将auto占位符替换为真正的类型。注意:C++11中auto不能用于函......
  • Linux Shell编程--正则表达式、grep、sed、awk
    前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除!一、正则表达式1、正则表达式定义1.1、简介正则表达式是一种强大的文本模式匹配工具,用于搜索、替换或分割字符串。在Shell脚本中,正则表达式通常与grep、sed和awk等工具一起使用。1.2、层次分类基......
  • 【Regex】正则表达式详解:从基础到高级应用(保姆篇)
    文章目录正则表达式详解:从基础到高级应用一、正则表达式基础1.什么是正则表达式?2.基本组成部分二、正则表达式的常用模式1.字符匹配2.量词3.位置符号4.分组和捕获三、正则表达式的高级应用1.断言(Assertions)2.贪婪与非贪婪匹配四、正则表达式在不同编程语言中......
  • com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: can not find lamb
    异常提示:com.baomidou.mybatisplus.core.exceptions.MybatisPlusException:cannotfindlambdacacheforthisentity 使用mockito框架做单元测试:mybatisplus使用Lambda表达式做条件查询、条件更新时会遇到mybatis拿不到缓存问题:错误1:com.baomidou.mybatisplus......