java中Lambda表达式

用AnythingLLM搭建私人RAG知识库:从入门到实战调优指南 大型语言模型虽然知识渊博,但无法触达私有文档中的具体内容,这正是检索增强生成(RAG)技术的核心价值所在。RAG通过先将文档切块并向量化,再在提问时检索最相关的片段拼接给模型,让AI基于指定资料精准回答,无需昂贵的模型微调。这种架构不仅让知识更新即时生效,还大幅降低了私有化部署的门槛。在实际工程中,RAG的落地需要合理选择嵌入模型、设计分块策略并调优检索参数,才能避免答非所问。对于个人或小团队,使用开源工具搭建本地知识库是最省心的路径,其中AnythingLLM以其开箱即用的特性,成为连接向量检索与模型推理 阅读详情


Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda 表达式(Lambda expression),基于数学中的λ演算得名,也可称为闭包(Closure) 。

Lambda表达式的语法

基本语法: (parameters) -> expression 或 (parameters) ->{ statements; }
Lambda表达式由三部分组成:

  1. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。

  2. ->:可理解为“被用于”的意思

  3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不反回

函数式接口

要了解Lambda表达式,首先需要了解什么是函数式接口,函数式接口定义:一个接口有且只有一个抽象方法 。

注意:

  1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口

  2. 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接
    口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只
    有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。

@FunctionalInterface
interface NoParameterNoReturn {
 //注意:只能有一个方法
    void test();
    }

但是这种方式也是可以的:

@FunctionalInterface

interface NoParameterNoReturn {
    void test();
    default void test2() {
        System.out.println("JDK1.8新特性,default默认方法可以有具体的实现");
   }
}

Lambda表达式的基本使用

1.无参数无返回值

  //无返回值无参数
@FunctionalInterface
   interface NoParameterNoReturn{
        //注意:函数式接口只能有一个抽象方法
        void test();
        }
        public class lambda {
     public static void main(String[] args) {
        NoParameterNoReturn noParameterNoReturn = () -> System.out.println("hello");
                noParameterNoReturn.test();
    }
    }

在这里插入图片描述
2.无返回值一个参数

 //无返回值一个参数
        @FunctionalInterface
        interface OneParameterNoReturn {
            void test(int a);
        }
          public class lambda {
          public static void main(String[] args) {
 //参数类型只有一个可以省略还可以省略参数的括号
                OneParameterNoReturn oneParameterNoReturn = (x) -> System.out.println(x + 10);
                oneParameterNoReturn.test(19);
            }
            }

在这里插入图片描述

3.无返回值多个参数

    //无返回值多个参数
        @FunctionalInterface
        interface MoreParameterNoReturn {
            void test(int a, double b);
        }
      
          public class lambda {
          public static void main(String[] args) {
 //类型不可以单独省略,除非一起省略
                MoreParameterNoReturn moreParameterNoReturn = (x, y) -> System.out.println(x + y);
                moreParameterNoReturn.test(10, 20);
            }
            }

在这里插入图片描述
4.有返回值无参数

    //有返回值无参数
        @FunctionalInterface
        interface NoParameterReturn {
            int test();
        }
                  public class lambda {
                  public static void main(String[] args) {
 //              //可以省略return
//        NoParameterReturn noParameterReturn=()->{return 10;};
                NoParameterReturn noParameterReturn = () -> 10;
                int ret = noParameterReturn.test();
                System.out.println(ret);
            }
            }

在这里插入图片描述
5.有返回值一个参数

      //有返回值一个参数
        @FunctionalInterface
        interface OneParameterReturn {
            int test(int a);
        }
         public class lambda {
          public static void main(String[] args) {
          OneParameterReturn oneParameterReturn = x -> x + 10;
                int ret = oneParameterReturn.test(9);
                System.out.println(ret);
                }
               }

在这里插入图片描述
6.有返回值多参数

  //有返回值多参数
        @FunctionalInterface
        interface MoreParameterReturn {
            int test(int a, int b);
        }
         public class lambda {
          public static void main(String[] args) {
            MoreParameterReturn moreParameterReturn = (x, y) -> x * y;
                int ret = moreParameterReturn.test(10, 20);
                System.out.println(ret);
            }
           }

在这里插入图片描述

语法精练

  1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。

  2. 参数的小括号里面只有一个参数,那么小括号可以省略

  3. 如果方法体当中只有一句代码,那么大括号可以省略

  4. 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字

变量捕获

Lambda 表达式中存在变量捕获 ,了解了变量捕获之后,我们才能更好的理解Lambda 表达式的作用域 。Java当中的匿名类中,会存在变量捕获

匿名内部类的变量捕获

class Test {
    public void func(){
        System.out.println("func()");
   }
}

public class TestDemo {
    public static void main(String[] args) {
        int a = 100;
        new Test(){
            @Override
            public void func() {
                System.out.println("我是内部类,且重写了func这个方法!");
                System.out.println("我是捕获到变量 a == "+a

                        +" 我是一个常量,或者是一个没有改变过值的变量!");
           }
       };
   }
}

在这里插入图片描述
此时这个代码可以正常运行,而当匿名内部类中修改a的值此时就会报出错误

class Test {
    public void func(){
        System.out.println("func()");
    }
}

public class TestDemo {
    public static void main(String[] args) {
        int a = 100;
        new Test(){
            @Override
            public void func() {
                a=99;
                System.out.println("我是内部类,且重写了func这个方法!");
                System.out.println("我是捕获到变量 a == "+a +" 我是一个常量,或者是一个没有改变过值的变量!");
            }
        };

    }
}

在这里插入图片描述
在上述代码当中的变量a就是,捕获的变量。这个变量要么是被final修饰,如果不是被final修饰的 你要保证在使用之前,没有修改

Lambda的变量捕获

@FunctionalInterface
interface NoParameterNoReturn {
    void test();
}

public static void main(String[] args) {
        int a = 10;
        NoParameterNoReturn noParameterNoReturn = ()->{
            // a = 99; error
            System.out.println("捕获变量:"+a);
       };
        noParameterNoReturn.test();
}

Lambda在集合当中的使用

Collection接口
forEach() 方法演示

 public static void main(String[] args) {
                List<String> list = new ArrayList<>();
                list.add("hello");
                list.add("this");
                list.add("day");
                list.forEach(new Consumer<String>() {
                    @Override
                    public void accept(String s) {
                        System.out.println(s);
                    }
                });
                System.out.println("==========");
                list.forEach(s -> System.out.println(s));
                }

在这里插入图片描述

List接口
sort()方法

public static void main(String[] args) {
                List<String> list = new ArrayList<>();
                list.add("hello");
                list.add("this");
                list.add("day");
 list.sort(new Comparator<String>() {
                    @Override
                    public int compare(String o1, String o2) {
                        return o1.compareTo(o2);
                    }
                });
                list.sort((o1, o2) -> {
                    return o1.compareTo(o2);
                });
                list.forEach(s -> System.out.println(s));
            }

在这里插入图片描述

Map接口
HashMap的forEach()

public static void main(String[] args) {
                Map<String, Integer> hashMap = new HashMap<>();
                hashMap.put("hello", 3);
                hashMap.put("abc", 2);
                hashMap.put("this", 5);
                hashMap.forEach(new BiConsumer<String, Integer>() {
                    @Override
                    public void accept(String s, Integer integer) {
                        System.out.println("key" + s + "vay" + integer);
                    }
                });
                hashMap.forEach((String s, Integer integer) -> System.out.println("key" + s + "vay" + integer));
            }

在这里插入图片描述

Lambda优点和缺点

优点:

  1. 代码简洁,开发迅速

  2. 方便函数式编程

  3. 非常容易进行并行计算

  4. Java 引入 Lambda,改善了集合操作 缺点:

  5. 代码可读性变差

  6. 在非并行计算中,很多计算未必有传统的 for 性能要高

  7. 不容易进行调试

别再手动改颜色了!用这个Word宏,一键搞定Zotero参考文献超链接的蓝色样式 本文介绍如何利用Word宏一键修改Zotero参考文献的超链接颜色,解决手动调整的繁琐问题。通过详细的VBA代码解析和高级定制方案,帮助科研人员快速实现文献引用的自动化格式优化,提升论文排版效率。特别适合需要批量处理APA等标准格式蓝色超链接的用户。 阅读详情

相关推荐

保姆级教程:用sw_urdf_exporter插件将Solidworks机械臂模型转为ROS可用的URDF

本文提供了一份详细的保姆级教程,指导用户使用sw_urdf_exporter插件将Solidworks机械臂模型转换为ROS可用的URDF文件。从环境准备、插件配置到模型预处理和关键参数设置,再到ROS环境集成测试和性能优化,全面覆盖了机械臂URDF转换的全流程。特别适合机器人工程师和ROS开发者快速实现Solidworks模型到ROS环境的无缝迁移。

weixin_29300931的博客 401

Java lambda Stream List过滤筛选、排序、分组(Java进阶)

重要!重要!重要!用起来很方便,舍弃for循环查找符合的对象 返回集合 在List中筛选出Map中“jzqklx”的值等于“abc”的Map,返回List集合 d为dayFwsl集合中的Map对象 List中可以是任意对象,如List判断条件可以.fiter(d->StringUtils.equals(d.getType(), “01”)) List<Map<String, Object>> dayFwsl = new ArrayList<>(); Lis.

乾坤鸟的博客 1万+

ADS仿真功率放大器实例学习笔记

ADS仿真功率放大器实例学习笔记

qq_36521926的博客 1万+

java8的lambda用法总结(持续更新)

从去年开始就经常性用到lambda表达式的代码,部分经常用,部分不太用的总忘记,干脆总结下用法 1.从集合中抽取某一元素的集合 List<String> idList = ProductService.list(new Product().setCreateUserId(nodeUser.getUserId())) .stream().map(t -> t.getProductId()).collect(Collectors.toList()); 2.集合去重 List<Pro

qq_40430380的博客 2064

《数据结构》04-树4 是否同一棵二叉搜索树

题目 给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。 输入格式: 输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要...

叫我皮卡丘 2012

c转c++——蓝桥杯

在这里,`int &i` 表示 `i` 是一个整型的引用变量,而不是一个拷贝,这意味着在循环中对 `i` 的修改会影响到数组 `arr` 中对应位置的值。arr则是需要遍历的数组。一、为啥要转C++:之前只学过C语言,然后为了蓝桥杯苦哈哈敲了C好久,偶然听了别人的意见去看了一下C++后发现简直太香了——C++不像C要把底层逻辑自己敲出来,而是可以直接调用STL函数库(比如排序,C语言可能要敲个几十行代码C++直接用调用sort函数就可以了),而且C++完全兼容C语言,里面的语法全部可以用C替换。

smwymzqbyl的博客 2045

[Java学习日记]查找、排序、递归、lambda表达式

4.创建findIndex(arr,块数组,target)根据块的下标,得到在arr数组中的查找的范围。设置左右标,右标向左找比中标小的,逮到了一个就停,那么左标就找比右标大的,逮到了就停下。从0索引开始与后面的元素比较,小的放前面,大的放后面,确定数字的顺序是从前往后确定的。把前面的数字看作有序,把后面的数字看作无序,把后面的数据一个一个放到前面的有序数组中。1.把0索引作为中标,移动之后,中标的左边都是比他小的,右边都是比它大的。3.然后做什么事情就知道了:交换左右标上面的数字,左右标继续移动找人。

m0_63186780的博客 282

2023电赛B题实战解析:基于立创天空星开发板的同轴线缆长度与负载测量系统

本文详细解析了2023年全国大学生电子设计竞赛B题的实战方案,重点介绍了基于立创EDA天空星开发板(STM32F103)的同轴线缆长度与负载测量系统。文章深入剖析了两种核心测量方案,并推荐了更稳定易实现的NE555测电容法,提供了从硬件选型、电路设计到软件编程、参数标定的完整“施工图”,实测精度可达厘米级和皮法级,为电赛复现与高精度测量学习提供了清晰指导。

weixin_36303305的博客 232

Java lambda 动态查询

我在 微软 REST API指南 中 了解到, 微软设计数据查询是按照如下方式来获取数据的。示例:返回所有价格低于 $10.00 的产品示例:名称等于“牛奶”的所有产品示例:名称不等于“牛奶”的所有产品我在MSDN了解到对于这些实体类型中的任何一个,你都需要筛选并仅返回那些在其某个 string 字段内具有给定文本的实体。尽管可以为 IQueryable 编写一个自定义函数,并为 IQueryable 编写另一个自定义函数。......

bosaidongmomo的博客 1690

用STM32F103C8T6和TB6612驱动模块,从零搭建一辆能避障循迹的智能小车(附完整代码)

本文详细介绍了如何使用STM32F103C8T6和TB6612驱动模块从零搭建一辆能避障循迹的智能小车。内容涵盖硬件选型、电路设计、底层驱动配置以及智能行为算法实现,并附有完整代码示例,帮助开发者快速掌握嵌入式开发的核心技术。

weixin_42641741的博客 446

光模块MCU开发全解析:从架构原理到固件调试实战

在高速光模块中,MCU并非传统印象里的核心处理器,而是负责数字诊断、闭环控制和协议管理的嵌入式管家。随着800G、1.6T模块的普及,MCU与DSP/SoC的协同、I2C总线通信、ADC采集、APC/TEC控制等低速域任务愈发关键。理解MCU的选型规格、启动流程和固件设计,是保障光模块稳定运行的基础。本文从光模块架构切入,剖析MCU的角色定位,详细拆解I2C从机实现、电芯片配置、校准与升级等工程细节,并结合实际调试经验梳理常见故障与排查思路,为嵌入式工程师提供一份可落地的光模块MCU开发指南。

weixin_29192365的博客 365

【java】Maybatis-Plus 数据库查询 lambdaQuery和mapper中EQ、NE、GT、LT、GE、LE、select、like、in、leftjoin的用法及详解

【java】Maybatis-Plus 数据库查询 lambdaQuery和mapper中EQ、NE、GT、LT、GE、LE、select、like、in、leftjoin的用法及详解

想去码头整点儿薯条儿~ 2万+

【产品】 产品设计:如何解决铝合金氧化着色后表面硬度低的问题(硬质氧化)

1、氧化处理技术 1)化学氧化 化学氧化处理所获得的膜层较薄,一般厚度为0.5μm ~4μm,质软不耐磨,抗蚀能力低于阳极氧化膜。 一般不宜单独便用,由于化学氧化膜吸附能力好,主要作用于油漆的底层,化学氧化按其溶液性可分为碱性和酸性两种。按其膜层性质可分为氧化膜,磷酸盐膜、铬酸盐膜及磷酸一铬酸盐膜等(这类型的氧化膜是可导电)。 2)电化学氧化(阳极氧化) 电化学氧化(俗称阳极氧化)是铝及...

产品线负责人 9741

Java语法—— Lambda表达式

Lambda表达式

爱敲代码的三毛的博客 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java Lambda 表达式

Java Lambda 表达式

Yeats_Liao的博客 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java】:lambda 表达式

📃1. 背景 🚀🔥Lambda表达式 是JDK8新增的特性,Lambda表达式 可以取代大部分匿名内部类,写出更优雅的Java代码,尤其在集合的遍历和其他集合操作中,可以将函数作为一个方法的参数,也就是函数作为参数传递到方法中,极大地优化代码结构JDK也提供了大量的内置函数式接口供开发者使用,使得Lambda表达式 的运用更加方便、高效。Lambda2. 基本使用 🖊🥑 1. 语法格式🎈 Lambda表达式的基本语法:由组成类似方法中的形参列表,这里的参数是函数式接口里的参数。

island1314的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Java】Lambda表达式

在Java之前的版本中,Java主要采用面向对象的编程风格,而Lambda表达式的引入使得Java具备了函数式编程的能力。匿名内部类的冗余代码:在Java之前的版本中,为了实现函数的传递,常常需要使用匿名内部类来定义一个函数接口的实现。这导致代码冗长、可读性较差。在Lambda表达式中,根据上下文的要求,可以自动匹配函数式接口的抽象方法,并创建接口的实例。可读性的折衷:尽管Lambda表达式可以提高代码的可读性,但在某些复杂的情况下,Lambda表达式可能变得难以理解和阅读,特别是当表达式变得过于复杂时。

qq_61635026的博客 7688

Java的lambda表达式

1. Java的lambda表达式 Java小案例:原始写法 package com.aaa.entity; public class Program { public static void main(String[] args) { Cal cal = new Cal() { @Override public int add(int a, int b) { return a + b;

m0_58680865的博客 6059

JAVA中的lambda表达式

Lambda 表达式是 Java 8 中的一个强大功能,它支持函数式编程风格,让我们能够更加简洁和灵活地处理集合操作、事件监听、线程等任务。通过简化匿名内部类的写法,Lambda 提高了代码的可读性和可维护性。

qq_55021218的博客 1960

Java中的 Lambda表达式

文章目录前言一、Lambda表达式是什么?二、格式三、省略模式四、Lambda表达式和匿名内部类区别四、Lambda表达式支持的方法引用四、注意事项总结 前言 Lambda表达式是Java的学习过程中一个比较重要的点,它能让我们在编写代码的时候有更加清楚明了的逻辑。 一、Lambda表达式是什么? Lambda表达式叫做函数式编程思想概述(函数式思想是尽量忽略面向对象的复杂语法:”强调做什么,而不是以什么形式去做“) 二、格式   1. ():里面没有内容,可以看成是方法形式参数为空 ..

bankser的博客 3794

Java Lambda表达式

Lambda 表达式是函数式编程的一种体现,它允许将函数当作参数传递给方法,或者将函数作为返回值,这种支持使得 Java 在函数式编程方面更为灵活,能够更好地处理集合操作、并行计算等任务。Lambda 表达式可以访问外部作用域的变量,这种特性称为变量捕获,Lambda 表达式可以隐式地捕获 final 或事实上是 final 的局部变量。Lambda 表达式能够更方便地实现并行操作,通过使用 Stream API 结合 Lambda 表达式,可以更容易地实现并行计算,提高程序性能。lambda 表达式的。

weixin_75111785的博客 1116

Java中Lambda表达式的使用

详细的描述了Lambda表达式的概念,介绍了Lambda结合集合的使用

yican2580的博客 1812

java Lambda表达式练习

关于JAVA8新特性,Lambda表达式的练习。 java8更新许久,但从来没有试验整理过。借公司空闲之际,练习一下Lambda表达式! 练习题目,均为网上寻找题目(原版地址找不到了)。 本文lambda学习主要参考博主葵花下的獾的文章,参考链接https://blog.youkuaiyun.com/qq_28410283/article/details/80634725(非常有用,lambda其他知识...

weixin_43821614的博客 4470
上一篇: Java中的反射和枚举
下一篇: java中的多线程(二)
糖芬蛋糕
博客等级 码龄5年 21粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值