JDK8新特性

【JavaSE】jdk8新特性 尚硅谷JavaSE笔记——jdk8新特性。个人实践总结,知识记忆架构不一定适合所有人,建议先阅读文章目录 阅读详情

JDK8新特性

一、Lambda表达式

1.组成:

  1. 以逗号隔开的参数列表(xx,xx,xx…)
  2. ->符号
  3. Lambda表达式方法体。(λ代码块)

2.lambda表达式的作用

1.删减了大量的无用代码,使得编程可以直奔核心;
2.让Java开始支持函数式编程。

2.1、lambda表达式删减了大量的无用代码,使得编程可以直奔核心。

  现在,先用传统方式,实现一个入门级的多线程程序,如下。

//以多线程为例。我们要启动一个多线程需要
    @Test
    void contextLoads() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("线程执行");
            }
        }).start();
    }

  程序中,new Thread()的参数是一个Runnable 接口,本次用匿名内部类方式实现了该接口,并重写了接口中的run()方法。但仔细读这种代码,容易发现 里面出现了大量的无用代码
在这里插入图片描述
代码中方法必不可少的东西:
(1)run()方法的参数列表:()
(2)方法体:System.out.print(…)
  其中很容易理解,对于一个方法(函数)而言,参数列表和方法体 是没法省略的。(有人可能问:为什么返回值类型可以省?因为lambda有自动类型推测机制,可以根据return值 自动推算出返回值类型)。
  好,搞懂以上后,lambda表达式的语法就出来了:
  lambda表达式由 参数列表 和方法体 两部分组成,并且二者之间使用“->”进行连接。lambda表达式的最大作用,就是对上述形式的“匿名内部类”进行简化。现在,将上述代码,使用lambda写成如下的等价程序。

 /**
 *Lambda表达式是用来简化代码的,所以对于方法中能省的全省掉,就是Lambda表达式
 *但有些是不能绝对省的1.方法体不能省 2.方法列表不能省
 */
 @Test
    void contextLoads() {
        new Thread( () ->{
                System.out.println("线程执行");
            }
        }).start();
    }

将原来那些冗余的代码去掉以后,我们的代码变得简洁了很多

2.2 、让Java开始支持函数式编程。

  再仔细观察这句代码:

 new Thread( () ->{
                System.out.println("线程执行");
            }
        }).start();

  在使用lambda时,我们可以将 一段“函数”传到一个方法中,本次是将“() ->System.out.println(“Hello World”)”这段函数 作为参数,传到了new Thread(…)的构造方法中了。大家回忆一下,在以前,方法的参数是不是只能是 变量或表达式?因此lambda的出现,就可以让函数传到了方法的参数中,这也称为函数式编程。

3.函数式接口

3.1、函数式接口的定义

  函数式接口是指被@FunctionalInterface注解修饰,且有且只有一个抽象方法的接口。这是因为假如接口有多个抽象方法,使用lambda表达式表达的就不知道是哪个方法了。

 @Test
    void contextLoads() {
        new Thread( () ->{
                System.out.println("线程执行");
            }
        }).start();
    }
//创建Thread对象时,需要传入一个Runnable对象,假如Runnable有多个抽象方法。lambda表达式就不知道重写哪个方法了

注意:lambda表达式重写的必须是函数式接口(或者只有一个抽象方法的抽象类)
函数式接口需要注意以下几点:

  • 即使没有标注@FunctionalInterface ,但是只有一个抽象方法,也称之为函数式接口。
  • 特殊情况:如果某个接口中有多个抽象方法,但是只有一个抽象方法是本接口新定义的,其他抽象方法和Object中已有的方法重复,那么该接口仍然是函数式接口。(这种情况比较极端,了解即可)
3.2、 jdk自带的函数式接口

存放位置:函数式接口大部分放在java.util.function包下
  jdk自带了4大函数式接口:

//四大核心函数式接口
//有参,无返回值(消费型)
@FunctionalInterface
public interface Consumer<T> {
    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
 }
 
//无参,有返回值(供给型)
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}
 
//有参,有返回值(函数型)
@FunctionalInterface
public interface Function<T, R> {
    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
    }

//断言式接口
 @FunctionalInterface
 public interface Predicate<T> {
    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
    }

4、Lambda表达式的用法

4.1、第一种用法:定义一个函数式接口,用Lambda重写抽象方法

基本语法:函数式接口 变量名= lambda表达式。
  上示例


@Test
   public void testLambda() {
       //1. 测试使用断言型接口
       Predicate<Integer> isGood = (sorce) -> {//la
           return sorce > 80;
       };
     //上面这一步就相当于我们重写了Predicate接口的test(T t)方法
       System.out.println("Predicate接口断言你成绩及格时间为"+isGood.test(100));
       isGood.test(100);//调用重写后的test方法
       
         //2. 测试使用函数型接口
       Function<Integer,String> function=(a)->{
           return "Function接口接收参数"+a+",并将它进行二次方计算返回"+a*a;
       };
       //使用lambda表达式重写Function接口的R apply(T t)方法
       System.out.println(function.apply(100));//调用重写后的apply方法
        //3. 测试使用消费型接口
       Consumer<String> consumer=(a)-> {System.out.println("Consumer接口消费了:"+a);};
       consumer.accept("苹果");
       // 4. 测试使用生产型接口
       Supplier<String> supplier=()->{
           return "Supplier生产粮食";
       };
       System.out.println(supplier.get());
   }
4.2、第二种用法:将Lambda表达式代表的函数式接口作为一个方法的参数存在

基本使用:下面的程序中我们用Lambda表达式( (word) -> word.toUpperCase(Locale.ROOT))代表Function接口作为参数传递给方法。

   @Test
    public void testLambda(){
        String s = toUpper("hello,world", (word) -> word.toUpperCase(Locale.ROOT));
        System.out.println(s);
    }
    public String toUpper(String word, Function<String,String> fun){
      //此时fun的抽象方法apply,已经被lambda重写了,所以下面调用的是重写后的apply方法。
        return fun.apply(word);
    }

二、接口的默认方法和静态方法

1、接口的默认方法

  在jdk8之前,接口只能写抽象方法,jdk8以后接口可以有自己默认的方法。该接口的实现类可以调用接口的默认方法。当然了实现类也可以重写接口的默认方法.

public interface MyInterface {
  default void say(String word){
      System.out.println("我说"+word);
   }
}


public class MyInterfaceImpl implements MyInterface {
}
   @Test
   public void testInterfaceDefaultMethod(){
       MyInterface myInterface=new MyInterfaceImpl();
       myInterface.say("hello world");
   }
2、接口的静态方法

  接口定义的静态方法,可以直接通过接口名.方法直接调用。

public interface MyInterface {
     static void staticMethod(String word){
         System.out.println("我说"+word);
    }
}
    @Test
    public void testInterfaceStaticMethod(){
        MyInterface.staticMethod("hello boy");
    }
}

三、方法引用

  jdk8允许使用::来引用一个已经存在的方法。其语法如下:
类名::方法名
注意:只需要写方法名,不需要写括号。
方法的引用,有以下4种:
  1):引用静态方法 类名::方法
  2):引用某个对象实例的方法 实例名::方法
  3):引用某个类型任意对象的实例方法 类型(接口名)::方法
  4):引用构造方法 类名::new

四、重复注解

  java5引入注解以后,注解就被广泛使用,但是java5引入的注解有个局限,就是在同一个地方同一个注解只能使用一次。java8打破了这个限制,引入重复注解的概念。可以在同一个地方多次使用同一个注解。
  java8中使用@Repeatable定义重复注解。

/*@Repeatable 注解是用于声明其它类型注解的元注解,来表示这个声明的注解是  可重复的。
*@Repeatable的值是另一个注解,其可以通过这个另一个注解的值来包含这个可重复的注解。
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
}
MONAI教程<1>-安装 MONAI的安装非常简单,常用的有两种方法: 直接 pip install monai 从GitHub 上安装 monai是通常配合其他库一起使用的,比如pytorch, nibabel, skimage, pillow等等。缺什么直接pip install 就行 阅读详情

相关推荐

CTF实战:从ECDSA签名漏洞到flag获取

本文详细解析了ECDSA签名算法在CTF比赛中的实战应用,重点探讨了随机数重用和参数泄露等常见漏洞。通过PWNHUB六月赛的例题,展示了如何从签名数据中恢复私钥并获取flag,同时提供了防御措施和实战技巧,帮助参赛者提升解题能力。

weixin_42706667的博客 278

jdk8新特性

Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:左侧:指定了 Lambda 表达式需要的参数列表 右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即Lambda 表达式要执行的功能。只包含一个抽象方法的接口,称为函数式接口。你可以通过 Lambda 表达式来创建该接口的对象。

jiapu_的博客 3315

TMS320C6678开发笔记1-6---C6678单核烧写程序

第6节 单核烧写加载程序 6.1节 TI参考文档 参考文档:《KeystoneI Bootloader Resources and FAQ》讲的非常好,建议一定要看 https://processors.wiki.ti.com/index.php/KeystoneI_Bootloader_Resources_and_FAQ#Direct_Boot_Examples_.28without_IBL.29 里面有三个工程: C6678 EVM SPI boot example C6657 EVM ..

kunkliu的博客 5697

JDK8的一些主要的新特性

是一个重要的版本,带来了许多显著的特性和改进,极大地提升了 Java 语言的功能性和开发效率。以下是 JDK 8 的一些主要新特性:一、Lambda 表达式1.简化匿名内部类的写法, 允许你以简洁的方式表示可传递给方法或存储在变量中的代码块 ,使代码更加简洁紧凑。例如,对于一个只有一个抽象方法的接口,可以使用 “(参数列表) -> {方法体}” 的形式来创建该接口的实例。2.提高了代码的可读性和可维护性,尤其是在处理集合、函数式编程等场景下。二、函数式接口。

momovi的博客 3915

MOSFET热失效机理与保护电路设计:实战案例

深入解析MOSFET工作原理及其在高温下的失效机制,结合实际案例探讨有效保护电路设计,提升系统可靠性与安全性。

weixin_28713083的博客 851

Halcon工业相机开发全流程:从SDK配置到实时图像采集(C++版)

本文详细介绍了使用C++进行Halcon工业相机开发的完整流程,从SDK配置到实时图像采集的实现。涵盖环境搭建、设备初始化、回调机制、参数控制等关键环节,并提供异常处理和实战案例,帮助开发者快速掌握工业视觉系统的开发技巧。

weixin_33728268的博客 514

JAVA8新特性

一、接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码 代码如下: interface Formula {     double calculate(int a);     default double sqrt(int a) {         return Math.sqrt

地平线的专栏 4701

VC Spyglass实战指南:从零开始掌握CDC约束配置与调试

本文详细介绍了如何使用VC Spyglass进行CDC约束配置与调试,从基础环境搭建到典型CDC问题调试实战,帮助开发者快速掌握跨时钟域验证技术。通过TCL脚本和SDC约束的深度解析,提升CDC验证效率,避免常见设计风险。

weixin_26757925的博客 297

JDK8新特性:

java基础--jDK8新特性

m0_49102053的博客 2026

基于Python的军事装备信息爬虫实战:Scrapy+Playwright+智能反反爬技术

本文将详细介绍如何使用Python构建一个高效的军事装备信息爬虫系统。我们将从基础的HTTP请求开始,逐步深入到使用Scrapy框架、Playwright浏览器自动化以及最新的反反爬技术。文章包含完整的代码实现、性能优化策略以及数据处理方案,旨在为读者提供一个全面的军事信息爬取解决方案。关键词:Python爬虫、军事装备、Scrapy、Playwright、反反爬。

2201_76125261的博客 1156

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8426

女同事问我JDK8以后有哪些新特性?给我整不会了

整理了JDK9 - JDK16有用的新特性,让你在欢声笑语中掌握它!

陈哈哈的菜园子 1万+

【DRAM存储器五十七】LPDDR5介绍--read DQ training和WCK DQ training

简述LPDDR5训练中的读写DQ训练

highman110的博客 523

JDK21 vs JDK8 新特性

摘要: JDK 21作为最新LTS版本,相比JDK 8实现了全面革新。核心差异包括: 语言特性:新增虚拟线程(百万级轻量级并发)、结构化并发、记录模式(深度解构对象)及增强的模式匹配(switch/instanceof); 性能优化:ZGC低延迟垃圾回收、向量API(SIMD加速计算)、紧凑字符串存储; 开发体验:简化单文件程序(无类名main方法)、标准HTTP客户端、字符串模板(类似f-string); 安全性:强制封装内部API、默认TLS 1.3加密; 移除内容:Applet、RMI激活等老旧功能。

csdn_tom_168的博客 3290

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JDK8、JDK17、JDK21新特性

Java 8 使得Java 平台又前进了一大步,尤其是 Stream 流操作,使用的时候非常的爽,整个代码看起来也更加的简洁、直观、舒服!Java21虚拟线程,多线程性能更快、更稳定

longzhutengyue的博客 2268

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Jdk8新特性

Java 8 (又称为 JDK 8或JDK1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性。

Java100q的博客 1901

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JDK 8 和 JDK 17 的区别和新特性

本文介绍了Java Development Kit (JDK) 8和JDK 17之间的区别和差异,以及它们各自的优势和特点。JDK 8是一种较老的JDK版本,它在性能和稳定性方面得到了广泛的验证和应用。JDK 17是最新版本的JDK,它包括许多新的特性和改进,如基于类的记录(Records)、弱引用垃圾回收器(ZGC)等,这些新特性和改进为Java开发者提供了更多的选择和机会,同时也需要不断学习和更新自己的知识和技能,以适应Java技术的发展和变化。文章提供了部分简单代码使用示例

qq_37686995的博客 1万+

JDK17新特性深度解析:从 JDK8 到现代 Java 的进化之路

JDK8与JDK17作为Java的长期支持版本,分别代表了不同时代的核心特性。JDK8凭借Lambda、Stream API等革新成为经典,而JDK17通过Record类型、Sealed类、模式匹配、ZGC等新特性,在性能、安全性和开发效率上实现全面提升。

m0_46421522的博客 2522

JDK17 vs JDK8 新特性

JDK17相比JDK8带来了重大革新:语言特性方面新增模式匹配、密封类、记录类、文本块和Switch表达式,大幅简化代码;API升级包括HTTP Client标准化、集合框架增强和NIO优化;性能上引入ZGC和Shenandoah垃圾回收器,提升JIT编译器;安全方面禁用SHA-1并支持新加密算法。建议新项目直接采用JDK17,存量项目可逐步迁移以利用新特性和性能优势,同时注意移除功能的替代方案。JDK17在代码简洁性、现代化API、性能优化和安全性方面全面超越JDK8。

csdn_tom_168的博客 1914

jdk8新特性(jdk8新特性面试)

jdk8.101和jdk8.102的区别 在JDK1.7的新特性方面主要有下面几方面的增强: 1.jdk7语法上 1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。 1.2 Switch语句支持string类型 1.3 Try-with-resource语句 注意:实现java.la...

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 1349

JDK8升级到JDK17的新特性

随着 AI 时代的浪潮席卷而来,人工智能技术在各行各业的应用愈发广泛,开发领域也迎来了新的变革。为了更好地适配 AI 场景的开发需求,SpringAI 已正式发布,它为开发者提供了构建 AI 应用的强大工具和框架。而要使用 SpringAI,与之配套的 Springboot 需要升级到 3.X 版本,这就对 JDK 的版本提出了新的要求 ——Springboot 3.X 明确要求 JDK 必须在 17 及以上版本。​。

LLLLLiSHI的博客 1226

探索JDK8的新特性

Java 8这个版本提供了很多实用的新特性,针对接口推出了接口默认方法,接口静态方法以及函数式接口,同时为了简化代码编写,推出了lambda表达式,为了增强对数据的操作,还定义了Stream操作等。这个版本目前是市场上一个应用最广泛,也是最重要的一个版本。JDK8中对接口规范进行了新的定义,允许在接口中定义默认方法(使用default关键字修饰),静态方法,同时还推出了函数式接口(使用@FunctionInterface注解描述)设计。

南 阳 的博客 1914

JDK8到JDK17都升级了那些新特性?又有哪些能常用好用的?

Java依然是服务器端开发、Android移动应用和大数据处理等领域的首选语言之一。凭借其稳定性、广泛的生态系统及不断的技术改进,Java维持着强大的生命力和竞争力。

Tamate的博客 1161

【JavaSE之JDK8新特性】三万字详文带你了解JDK8新特性

1.了解了什么是lambda 表达式,lambda 表达式和匿名内部类的区别; 2.了解了默认方法是个啥,JDK8使得接口里也可以有静态方法了; 3.介绍了四个函数式接口,Supplier,Consumer,Function,Predicate; 4.方法引用的概念以及其中的语法格式; 5.引入了Stream流(遍历数据集的高级迭代器); 6.介绍了Stream的常用方法,学习了如何更好的处理数据

qq_63691275的博客 2753
上一篇: SpringBoot
下一篇: spring(注解版)将组件加入到容器
java加油鸭
博客等级 码龄7年 3粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值