JAVA 8 新特性 Lamdba表达式

news2025/7/27 12:32:44

Java8 新特性:

1、Lamdba表达式
2、函数式接口
3、方法引用和构造引用
4、Stream API
5、接口中的默认方法和静态方法
6、新时间日期API
7、Optional

8、其他特性

Java8 优势:速度快、代码更少(增加了新的语法 Lambda 表达式)、强大的 Stream API、便于并行、最大化减少空指针异常 Optional;

一、Lambda表达式

Lambda 是一个匿名函数,它是一段可以传递的代码(将代码像数据一样进行传递)。可以取代大部分的匿名内部类,可以写出更简洁、更灵活的代码。尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。作为一种更紧凑的代码风格,使 Java 的语言表达能力得到提升。

 JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。 从匿名类到 Lambda 的转换:虽然使用 Lambda 表达式可以对某些接口进行简单的实现,但并不是所有的接口都可以使用 Lambda 表达式来实现。Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法。

二、为何使用Lambda表达式

  1.     提供Functional接口的实现。
  2.     编码少

三、Lambda表达式的语法 

   (parameters) -> expression

   或

   (parameters) ->{ statements; }

四、 Lambda表达式重要特征 

  1. 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  2. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  3. 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  4. 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

五、Lambda表达式由三个组件组成

1)参数列表: 也可以为空或非空。

2)箭头令牌: 用于链接参数列表和表达式主体。

3)主体: 它包含表达式和语句

(1)无参数语法

() -> {
//Body of no parameter lambda
}
public class MyLamdba {
    public static void main(String[] args) {
       Person p=()->{
           return "Hello!";
        };
       //输出
        System.out.println(p.say());
    }
}

//@FunctionalInterface   //It is optional
interface Person{
    public String say();
}

 (2)一个参数语法

(a) -> {
//Body of single parameter lambda
}
public class MyLamdba {
    public static void main(String[] args) {
        //一个参数可以使用()
       Person p=(name)->{
           return "Hello!"+name;
        };
       //输出
        System.out.println(p.say("mike"));

       //一个参数也可以不使用()
        Person p2=name -> {
            return "Who are you? "+name;
        };

        System.out.println(p2.say("pop"));
    }
}

interface Person{
    public String say(String name);
}

  (3) 两个参数的语法

(p1,p2) -> {
//Body of multiple parameter lambda
}
public class MyLamdba {
    public static void main(String[] args) {
        //多个参数必须使用()
       Person p=(name,age)->{
           return "Hello!"+name+",Are you "+age+" years old?";
        };
       //输出
        System.out.println(p.say("mike",18));
    }
}

interface Person{
    public String say(String name,int age);
}

(4)返回值带有或不带有return关键字

public class MyLamdba {
    public static void main(String[] args) {
//        one();

        //(1) (parameter)->(expression)
        Addable a1=(a,b)->(a+b);
        System.out.println(a1.add(100,50));

        //(2) (parameter)->{statements}
        Addable a2=(a,b)->{
            return  a+b;
        };
        System.out.println(a2.add(1,5));

    }

}

interface Addable{
    public int add(int a,int b);
}

(5)Foreach循环

 List<String> list= Arrays.asList("sunny","windy","cloudy","rainy");
 list.forEach(m-> System.out.println(m));

六、Lamdba函数接口

    方法引用通过一对双冒号:: 来表示,方法引用是一种函数式接口的另一种书写方式

  1. 静态方法引用,通过类名::静态方法名, 如 Integer::parseInt
  2. 实例方法引用,通过实例对象::实例方法,如 str::substring 
  3. 类名::实例方法名, 如 String::substring
  4. 构造方法引用,通过类名::new, 如 User::new

java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有: 

public class MyLamdba2 {
    public static void main(String[] args) {
        //接受一个输入参数 String
        Consumer<String> cc=Pet::show;
        cc.accept("宠物!");

        //接受一个输入参数 Pet
        Consumer<Pet> pet=Pet::eat;
        pet.accept(new Pet());

        //接受两个输入参数 Pet, String
        BiConsumer<Pet,String> p1=Pet::say;
        p1.accept(new Pet(),"你好啊!");

        //接受两个输入参数 Pet, String,并返回一个值Integer
        BiFunction<Pet,String,Integer> p2=Pet::play;
        int num=p2.apply(new Pet(),"好球");
        System.out.println(num);

    }

}

class Pet{
    //静态方法 -有参无返回
    public static void show(String str){
        System.out.println("show方法:"+str);
    }

    //实例方法 -无参无返回
    public void eat(){
        System.out.println("eat方法:"+this.toString());
    }

    //实例方法 -有参无返回
    public void say(String str){
        System.out.println("say方法:"+str);
    }

    //实例方法 -有参有返回
    public int play(String str){
        System.out.println("play方法:"+str);
        return 10;
    }
}

用::提取的函数,最主要的区别在于静态与非静态方法,非静态方法比静态方法多一个参数,就是被调用的实例

 构造方法的引用
   一般我们需要声明接口,该接口作为对象的生成器,通过 类名::new 的方式来实例化对象,然后调用方法返回对象。

public class Student {

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    String name;
    Integer age;

    Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "{" +
                "name=" + name +" " +
                ", age=" + age +
                '}';
    }
}
public class MyLamdba3 {
    public static void main(String[] args) {
        IBlackConstruct ibc = () -> new Student();
        Student stu = ibc.getStudent();
        System.out.println(stu);

        IBlackConstruct ibc2 = Student::new;
        Student stu2 = ibc.getStudent();
        System.out.println(stu2);

        IParameterConstruct ibc3 = Student::new;
        Student stu3 = ibc3.getStudent("zhangsan", 18);
        System.out.println(stu3);

    }
}

interface IBlackConstruct {
    // 对象定义 -无参数
    Student getStudent();
}

interface IParameterConstruct {
    // 对象定义 -有参数
    Student getStudent(String name, int age);
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos安装Python、PyCharm

安装Python 1、打开终端(Terminal) 2、输入以下命令更新系统&#xff1a; sudo yum update 3、安装Python&#xff1a; sudo yum install python3 4、安装完成后&#xff0c;可以使用以下命令检查Python版本&#xff1a; python3 --version 安装PyCharm 1、下载PyCharm的安…

SQL server设置用户只能访问特定数据库、访问特定表或视图

在实际业务场景我们可能需要开放单独用户给第三方使用&#xff0c;并且不想让第三方看到与业务不相关的表或视图&#xff0c;我们需要在数据库中设置一切权限来实现此功能&#xff1a; 1.设置用户只能查看数据库中特定的视图或表 1.创建用户名 选择默认数据库 服务器角色默认…

什么是项目管理?项目经理应该如何进行管理?

项目管理&#xff1a; 一是指一种管理活动&#xff0c;一种有意识地按照项目的特点和规律&#xff0c;对项目进行组织管理的活动&#xff1b; 二是指一种管理学科&#xff0c;以项目管理活动为研究对象的一门学科&#xff0c;它是探求项目活动科学组织管理的理论与方法。 就…

90%的程序员还不知道ChatGPT能这么用

本内容来自公众号“布博士”------&#xff08;擎创科技资深产品专家&#xff09;当下&#xff0c;越来越多的企业已经开始应用机器学习和自然语言处理等技术来辅助告警故障分析。在这个领域中&#xff0c;CHATGPT这样的人工智能模型可以扮演非常重要的角色&#xff0c;通过对历…

压榨配置写出颠覆认知的Java线程池

Java线程池参数调优前言线程池常见误解■ 必须用线程池 不能直接new线程■ 7参数的生效顺序结论Java线程池参数调优■ 网上流传的线程数计算公式■ 调整生产消费平衡疑问① 能否直接设置大量线程数疑问② 这个核心数最好吗■ 经典案例-业务请求第三方接口■ 反思过去配置的线程…

CSS 基础【快速掌握知识点】

目录 一、什么是CSS 二、CSS发展史 三、CSS基本语法结构 1、语法 2、例如 四、style标签 五、HTML中引入CSS样式 1、行内样式 2、内部样式表 3、外部样式表 六、CSS基本选择器 1、标签选择器 2、类选择器 3、ID选择器 4、总结 5、基本选择器的优先级 七、CSS的…

通过自适应 MFA 提高 IT 安全性

什么是多重身份验证 (MFA) 多重身份验证 (MFA)为登录流程增加了一层保护。访问帐户或应用时&#xff0c;用户需要提供额外的身份验证&#xff0c;例如扫描指纹或输入手机收到的代码。 为什么自适应的身份验证重要 鉴于当今不断变化的 IT 威胁形势&#xff0c;多重身份验证 &…

此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用。 了解详情(已解决)

当你在谷歌Play商店想要下载一些手机应用时&#xff0c;经常会有跳提示&#xff1a; 此 Google 帐号尚未与设备关联。要安装应用&#xff0c;请先访问设备上的 Play 商店应用。 了解详情 此时需要打开你的Chrome浏览器&#xff0c;打开设置-扩展程序-打开Chrome应用商店 或直接…

SpringBoot中使用spring-retry解决重试

使用场景 在日常开发过程中&#xff0c;难免会与第三方接口发生交互&#xff0c;例如&#xff1a;短信发送、远程服务调用、争抢锁等场景&#xff0c;当正常调用发生异常时&#xff0c;例如&#xff1a;网络抖动&#xff0c;这些间歇性的异常在一段时候之后会自行恢复&#xf…

【华为OD机试模拟题】用 C++ 实现 - 开心消消乐(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

支付系统中的设计模式09:组合模式

现在就剩下怎么能够实现运营部提出的「打印出平台顾客购买的商品小票」这个需求了。 我们去超市买完东西之后,都会收到收银员打印出来的小票,就是商品清单、价格、数量和汇总的信息。下面这个我想应该99%的人都见过吧。 图三十七:超市购物小票 线上也是一样,也会有这种购物…

【软件测试】测试人不躺平,进军高级自动化测试自救,你的不一样结局......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 随着测试从业年龄的…

2023面试必备:web自动化测试POM设计模式详解

1.背景 为UI页面写自动化测试用例时&#xff08;如&#xff1a;web自动化、app自动化&#xff09;&#xff0c;使用普通的线性代码&#xff0c;测试用例中会存在大量的元素定位及操作细节&#xff0c;当UI界面变化时&#xff0c;测试用例也要跟着变化&#xff0c;在自动化测试…

初学C/C++内存管理--new和delete的使用

一&#xff0c;内存分布 栈区&#xff1a; 一般的局部变量和函数的返回数据以及返回地址&#xff0c;函数的参数都在战栈区上开辟空间。栈区开空间一般由编译器自动管理&#xff0c;出了生命周期自动释放。也可以通过一些方式自己手动开辟栈区空间&#xff0c;不过一般用不到…

代码随想录【Day23】| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接 题目描述&#xff1a; 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新…

【python学习笔记】:如何去除字符串中空格

在输入数据时&#xff0c;很有可能会无意中输入多余的空格&#xff0c;或者在一些场景中&#xff0c;字符串前后不允许出现空格和特殊字符&#xff0c;此时就需要去除字符串中的空格和特殊字符。 【注意&#xff1a;这里的特殊字符&#xff0c;指的是制表符&#xff08;\t&…

2023/2/24 图数据库Neo4j的理解与应用

1 什么是图数据库&#xff08;graph database&#xff09; 十大应用案例&#xff1a;https://go.neo4j.com/rs/710-RRC-335/images/Neo4j-Top-Use-Cases-ZH.pdf “大数据”每年都在增长&#xff0c;但如今的企业领导者不仅需要管理更大规模的数据&#xff0c;还迫切需要从现有…

13、Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

简介 主页&#xff1a;https://github. com/microsoft/Swin-Transformer. Swin Transformer 是 2021 ICCV最佳论文&#xff0c;屠榜了各大CV任务&#xff0c;性能优于DeiT、ViT和EfficientNet等主干网络&#xff0c;已经替代经典的CNN架构&#xff0c;成为了计算机视觉领域通用…

第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)

目录1.技能升级1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.数据范围7.原题链接2.解题思路3Ac_code1.技能升级 1.题目描述 小蓝最近正在玩一款 RPG 游戏。 他的角色一共有 NNN 个可以加攻击力的技能。 其中第 iii个技能首次升级可以提升 AiA_iAi​点攻击力&#x…

django项目实战十(django+bootstrap实现增删改查)进阶数据统计

目录 一、echarts 1、下载 2、配置 二、实现统计分析页面--架构和柱图 1、url 2、chart.py 3、chart_list.html 4、修改url 5、新增chart_bar方法 6、修改chart_list.html 四、饼图 1、url 2、视图chart.py新增 3、修改chart_list.html 五、折线图 1、url 2、char…