说说java8新特性

        java8新特性主要有:函数式接口、lambda表达式、Stream API、接口对于static方法和默认方法的支持。

一、函数式接口

        函数式接口指的是只有一个抽象方法的接口,函数式接口用@FunctionalInterface注解修饰,java中常用的函数式接口有Runnable、Comparator等等。

二、lambda表达式

        lambda是从java8开始支持的新语法,lambda语法对java语言做了扩展。使用lambda表达式的前提是函数式接口的存在,在java8以前,当我们想要使用一个函数式接口时,需要定义它的一个具体实现类,在这个实现类中实现它的那个唯一的抽象方法;或者是使用匿名内部类的方式去实现。从java8开始,因为lambda表达式支持将函数作为一个参数传递到调用它的方法中,所以使用函数式接口时,我们不再需要去为它创建实现类。

        lambda的语法

        java8为lambda添加了一个新的操作符:->这个箭头符号,又叫做lambda操作符;lambda表达式的结构为:左半部分是函数的参数列表,右半部分是函数的具体实现,又叫lambda体,中间由lambda操作符将左右两边连接起来。此函数如果没有入参,则左边只是一个(),此函数如果只有一个入参,则小括号可以省略,此函数如果有多个入参,则这多个参数用()包起来,参数之间用英文逗号隔开,我们无需声明参数的类型,lambda可以从上下文中推断出参数的具体类型。对于lambda体:此函数的实现如果包含多行代码,则这多行代码用{}包起来,此函数的实现如果只包含一行代码,则{}可以省略,此函数如果只包含一行代码,且有返回值,则不止{}可以省略,return关键字也可以省略。

        lambda表达式的作用域

        1、在lambda表达式内部可以访问它所在方法的局部变量和参数,但是不可以修改这些局部变量和参数,虽然我们可以不必使用final关键字去修饰它们,但它们拥有final的隐式语义。

        2、对于能否在lambda表达式内部访问它所在方法的所属类中的变量和方法,取决于lambda表达式所在的方法是否是静态的,如果不是静态的,则可以访问类中所有属性和方法,包括静态的和非静态的、公有的和私有的;如果是静态的,则只能访问类中的静态属性和静态方法。

        3、对于默认方法的访问权限:在lambda表达式中无法访问默认方法。

        lambda表达式的出现,简化了函数式接口的使用,减少了代码中类的创建,以一种更加简洁的方式实现了函数式编程。

三、Stream API

        首先,Stream是从java8开始支持的一个抽象概念,它是为了实现对于集合数据的操作而设计的,使用Stream,使我们可以实现 像是使用SQL去操作数据库那样 去操作集合数据,Stream提供了一组高效易用的api去对集合数据执行操作,包括:集合中元素的过滤、分组、排序、类似于sql的limit操作、对于集合中各个元素的数据结构的转换、求集合中元素的数量、求最大元素、最小元素、为集合数据去重等操作。使用Stream API不会去改变数据源,只会返回一个包含着操作结果的新的stream。Stream的使用包含三个步骤:创建Stream、中间操作、终止操作。

        创建Stream

        创建Stream的方式有:Collection接口的stream方法、Arrays工具类的静态方法stream、Stream类的静态方法of。

        中间操作主要包括:

        1、用于数据过滤的filter方法:此方法需要传入一个函数作为参数,来定义数据的过滤逻辑。

        2、用于元素排序的sort方法:有两种排序方式:自然排序和定制排序,自然排序的sort不需要传任何参数,但是有一个使用前提是,集合中的元素必须有比较大小的能力,也即元素所属类型要实现了Comparable接口;定制排序的sort方法需要传入Comparator的compare函数作为参数,来定义元素比较大小的逻辑。

        3、limit skip方法,这俩方法都需要传入一个数值类型的参数,类似于sql中limit关键字,limit方法用于获取结果中的前n条记录,而skip方法是跳过n条记录,获取结果中的其他记录,这俩方法是互补的。

        4、distinct方法:此方法用于对集合中的数据去重,但是它有一个使用前提是,集合中的元素都重写了hashCode 和 equals方法,只有重写了这俩方法,distinct才能知道如何去判断两个对象是否重复。

        5、map方法,此方法支持传入一个函数作为参数,这个函数将被使用到集合中的每一个元素上,来实现元素的数据结构转换。

        多个中间操作连接成一个操作链,这些操作并不会立马执行,它们只有遇到了某个终止操作才会全部执行。

        终止操作主要包括:

        1、collect:这是最常用的一个终止操作,用于收集最终结果,它支持传入一个函数作为参数,包括:Collectors.toList();  Collectors.toSet();  Collectors.toCollection();分别用于将结果收集到一个list、set、一个普通集合中,还可以传入Collectors.groupingBy(...); 用于将结果按照某个规则进行分组,并将分组之后的数据收集到一个map结构中返回。

        2、count方法:此方法用于计算得到的结果数据的总条数,类似于sql中的count函数。

        3、max方法和min方法:这两方法分别用于返回集合中的最大元素和最小元素,使用这俩方法也有个前提是 集合中的元素要有比较大小的能力。

        Stream API的存在简化了对于集合数据的复杂操作的过程,使我们对于集合的操作更加简洁高效。

四、接口对于static方法和默认方法的支持

        在java8之前,接口中只能定义抽象方法,不能定义static方法,从java8开始接口开始支持静态方法的定义和实现,接口中定义的static方法的调用方式为:接口名.静态方法名。

        默认方法也是从java8开始支持的,在java8之前,当我们想要为某个已经存在的接口去添加功能,只能在这个接口中添加抽象方法,然后要在它的每个实现类中去实现这个抽象方法,否则会编译不通过,接口与实现类的耦合度太高了,因此在java8中引入了默认方法,默认方法指的是用default关键字修饰的非抽象方法,在接口中要写这个默认方法的方法体,因为它不是一个抽象方法,所以它可以直接被实现类继承而无须在实现类中覆盖它,只不过在default方法的继承上有一个需要我们注意的问题:

        当某个实现类既实现了某个接口又继承了某个类,而在它实现的接口和父类中定义了一个具有相同方法签名的default方法时,这个实现类继承的是父类的default方法。

        当某个父接口和它的一个子接口都定义了一个具有相同方法签名的default方法,而某个实现类实现了这个子接口时,这个实现类继承的是子接口的default方法,这个是根据就近原则。

        当某个实现类实现了多个接口,而这多个接口中都定义了一个具有相同方法签名的default方法时,实现类中需要覆盖这个default方法,否则会编译失败,当然我们可以在这个实现类的覆盖逻辑中,通过使用 接口名.super.default方法名(); 来引入某个接口的default方法的实现逻辑 来为此实现类所使用。

        

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

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

相关文章

鸿蒙开发笔记 2

提示:今天又是美好的一天呢!!! 文章目录 一、网络管理 一、网络管理 应用权限 http请求

内网渗透实战攻略

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 介绍 什么是内网? 什么是内网渗透? 内网渗透的目的: 内网…

2024--Django平台开发-Django知识点(六)

day06 Django知识点 今日概要: Form和ModelForm组件【使用】【源码】缓存【使用】ORM【使用】其他:ContentTypes、Admin、权限、分页、信号等 1.Form和ModelForm组件 背景:某个公司后台管理项目。 垃圾 def register(request):"&quo…

k8s之pod基础

k8s之pod基础 pod: pod是k8s中最小的资源管理组件 pod也是最小化运行容器化的应用的资源管理对象 pod是一个抽象的概念,可以理解为一个或者多个容器化应用的集合 在一个pod当中运行一个容器是最常用的方式 在pod当中同时运行多个容器,…

[机缘参悟-123] :实修 - 东西方各种思想流派实修的要旨与比较?

目录 前言: 一、东方各种思想流派实修的要旨? 1.1 儒、释、道、法的主要思想 1.2 儒、释、道、法各种追求的目标 1.3 儒、释、道、法各自修行的法门或修行的途径 二、西方灵修的各种派别的要旨? 2.0 西方灵修的各种派别 2.1 玛雅星系…

Java异常处理解析

在 Java 编程中,异常处理是一种重要的机制,用于处理程序运行时可能发生的意外情况。以下是对 Java 异常处理的解析: 异常的概念:异常是指在程序执行过程中发生的意外事件,可能导致程序无法正常运行。Java 中的异常可以…

Qt QRadioButton单选按钮控件

文章目录 1 属性和方法1.1 文本1.2 选中状态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的单选按钮类是QRadioButton它是一个可以切换选中(checked)或未选中(unchecked)状态的单选按钮单选按钮常用在“多选一”的场…

【算法题】44. 通配符匹配

题目 给你一个输入字符串 (s) 和一个字符模式 (p) ,请你实现一个支持 ? 和 * 匹配规则的通配符匹配: ? 可以匹配任何单个字符。 * 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要条件是:字符模式必须能…

分布式全局id

分布式全局id snowflake 算法是 twitter 开源的分布式 id 生成算法,采用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id,12 …

基于sprinmgboot实习管理系统源码和论文

随着信息化时代的到来,管理系统都趋向于智能化、系统化,实习管理也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时代的变化,而实习管理…

前端er们,你真的会用useState么?

React开发者们,我们都喜欢useState hook强大且简单的功力,但事实上,即使是经验最丰富的代码员也可能出错。 当涉及到在React中管理状态时,一个错误可能导致bug、性能问题,甚至更糟糕的是你的工作岌岌可危。 在本文中,我们将揭示5个需要你远离的常见useState错误。 继续关注,…

人工智能复习

机器学习中线性回归和逻辑回归: 机器学习的分类: 监督学习和无监督学习,半监督学习 监督学习(Supervised Learning): 监督学习是一种利用带有标签(标记)的数据进行训练的机器学习…

使用Windbg动态调试目标进程的一般步骤详解

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上,或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来,输入g命令将该中断跳过去 3、分析实例说明 …

【大厂算法面试冲刺班】day1:数据结构先导课-链表、列表

链表 /*链表结点类*/ class ListNode{int val; //结点值ListNode next; //指向下一结点的指针(引用)ListNode(int x){val x;} //构造函数 }在链表中查找值为target的首个结点 int find(ListNode head, int target){int index 0;while(head ! null){i…

鸿蒙HarmonyOS学习手册_入门篇

鸿蒙HarmonyOS学习手册_入门篇 文章目录 鸿蒙HarmonyOS学习手册_入门篇入门快速入门开发准备基本概念UI框架应用模型工具准备 构建第一个ArkTS应用(Stage模型)-快速入门-入门创建ArkTS工程ArkTS工程目录结构(Stage模型)构建第一个…

【笔记】Helm-2 如何使用-3 Chart发布操作用以自动化GitHub的页面Chart

Chart发布操作用以自动化GitHub的页面Chart 该指南描述了如何 使用Chart发布操作 通过GitHub页面自动发布chart。Chart发布操作是一个将GitHub项目转换成自托管Helm chart仓库的GitHub操作流。使用了 helm/chart-released CLI工具。 Helm Chart Releaser Actions GitHub Ma…

Vue-10、Vue键盘事件

1、vue中常见的按键别名 回车 ---------enter <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>键盘事件</title><!--引入vue--><script type"text/javascript" src"h…

使用Vivado Design Suite平台板、将IP目录与平台板流一起使用

使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板&#xff08;TDP&#xff09;创建项目&#xff0c;或者已经添加到板库的用户指定板。当您选择特定板&#xff0c;Vivado设计工具显示有关板的信息&#xff0c;并启用其他设计器作为IP定制的一部分以…

以数据资产入表为抓手,推动数据资产化

在数字化时代&#xff0c;数据已经成为企业的重要资产。数据资产化是将数据视为一种有价值的资产&#xff0c;对其进行有效管理和利用的过程。而数据资产入表则是将数据资产纳入财务报表&#xff0c;以反映其价值和对企业财务状况的影响。本文亿信华辰 将深入探讨数据资产化与数…

每天学习一点点之 Spring Boot 1.x 升级 2.x 之 allowBeanDefinitionOverriding

最近组内大佬正在进行 Spring Boot 版本的升级&#xff0c;从 1.x 版本升级到 2.x 版本。在查看代码变更时&#xff0c;我注意到我之前编写的一个名为 ShardingRuleStrategy 的类被添加了 Primary 注解。这个类在原来的代码中被标记为 Component&#xff0c;同时也在 API 中被定…