nutshell_Nutshell中的Java 8语言功能-第1部分

nutshell

你好朋友,

Java 8发布已经很长时间了,现在越来越多地被使用。 在本文中,我们将讨论以下Java 8主题。

1.功能接口

2.Lambda表达式

3.默认方法

Java 8

1.功能界面

什么是功能接口?

与一种并且只有一种抽象方法的接口是功能接口,因为它恰好表示一种功能。 但是,功能接口可以具有n个默认值以及静态方法。

功能接口的语法

就像任何其他界面一样。 唯一的区别是它应该在顶部具有@FunctionalInterface批注。

@FunctionalInterface
interface fly {}

另外,我们需要了解的是,即使我们不使用@FunctionalInterface批注,但一个接口只有一个抽象方法,则默认情况下该接口将被视为Functional Interface,但始终建议使用@FunctionalInterface批注用于功能界面。

放置@FunctionalInterface批注的优点是,今天,您可以通过仅在其中使用一个抽象方法而不使用@FucntionalInterface批注来定义接口为“函数接口”,并牢记可以为此函数接口编写lambda,但是如果您使用项目,并且有很多开发人员在该项目上工作,那么以后很有可能有人可以将其他方法添加到您的功能接口中,而该方法实际上将不会保留为功能接口,因为它将具有多个抽象方法,同时,也会破坏所有已经编写的lambda表达式。

因此,如果您打算编写一个可以编写lambda的接口,则最好使用@FunctionalInterface对其进行标记。

功能界面的主要目的

在Java 8中引入功能接口的主要目的是允许针对功能接口编写lambda表达式,因为已针对功能接口的方法验证了lambda表达式方法签名。

功能界面示例

@FunctionalInterfacepublic interface Calculator {int add(int a, int b);
}public class Test {public static void main(String[] args){Calculator calculator = (a,b) -> a + b;System.out.println("Sum is:"+ calculator.add(4,6));}}

JDK 1.8在java.util.function包中添加了许多内置的Functional Interface,可用于编写lambda表达式。

谓词

消费者

供应商

功能

2. Lambda表达式

Lambda表达是什么?

简单来说,Lambda表达式是Functional Interface方法的实现。 通常,我们在方法中编写实现,但是对于lambda而言,没有方法可以在其中编写,因此我们可以将lambda表达式视为匿名函数,即具有实现但没有任何名称的函数。

Lambda表达式的语法?

(Comma separated parameters)  + arrow symbol + single  expression or block of statements;

Lambda表达的主要目的

在Java 8中引入Lambda表达式的主要原因是要在Java中启用函数式编程。 在Java 8之前,如果我们想拥有一些要内联执行的功能,例如单击按钮,并且将此代码放在单独的类中没有意义,那么我们可以通过创建一个匿名类来实现。 在这些情况下,我们通常试图将功能作为参数传递给另一种方法,例如当某人单击按钮时应采取什么措施。 匿名类的问题在于,即使我们的实现非常小,使用匿名类编写的代码也非常冗长和不清楚。 使用lambda表达式,我们可以以更具可读性和简洁的方式编写代码。

Lambda表达式示例

让我们看看如何编写lambda表达式。

从上面的示例中,我们有以下界面:

@FunctionalInterfacepublic interface Calculator {int add(int a,int b);}

Lambda表达式是从Functional接口的方法派生的,因此使用add方法的签名,我们将编写第一个Lambda表达式。 括号内的左侧是参数,然后是箭头符号,然后是语句块。

(int a,int b) -> {return a + b;};

如果仔细观察,它就是没有任何方法名称的方法定义。 假设它有一个名称,则在删除箭头符号后,其外观将如下所示:

add(int a,int b) {return a + b;};

现在将其转换为Lambda时,Java设计人员删除了名称,即在参数后添加并放置一个箭头符号,如下所示:

(int a,int b) ->{return a + b;};

现在,由于编译器通过将lambda表达式与Functional Interface方法的签名进行匹配来检查lambda表达式的签名,因此编译器可以通过检查Functional Interface方法来猜测lambda表达式中传递的参数的类型。 因此,我们可以从参数中删除类型,以使修改后的lambda表达式如下所示:

(a, b) -> {return a + b;};

除了猜测参数的类型外,编译器还将通过查看函数接口中声明的方法的返回类型来了解该lambda表达式将返回int值,因此我们也可以删除return关键字。

(a, b) -> {a + b;};

现在,因为在上面的lambda表达式中,我们在块中只有一个语句,所以我们也可以删除花括号,因此修改后的lambda如下所示:

(a,b) -> a +b;

3.界面中的默认方法

什么是默认方法?

默认方法是具有一些默认实现的方法,可以在接口中定义。

在Java8之前,我们无法在接口中使用带有定义的方法,但是在Java8中,我们也可以在接口中使用带有定义的方法,但是这些都是特殊的方法,因为它们的签名中带有default关键字。

引入默认方法的主要目的

在Java中添加默认方法的主要原因是使代码向后兼容,即使在现有接口中引入了新方法,因为如果不存在默认方法,我们会尝试在现有接口中添加新方法,它将破坏所有实现类,因为那些现有的实现类必须在接口中实现新引入的方法。

默认方法的语法

public interface InterfaceTest{default public void testDefault(){}}

默认方法示例

自从JDK 1.5在JDK 1.8版本中引入了新的默认方法以来,就存在可迭代的接口。 现在,随着Collection接口扩展了此可迭代接口以及List等集合,Set扩展了Collection接口,默认情况下,此方法可用于这些集合以迭代这些集合的元素。

public interface Iterable<T> {default void forEach(Consumer<? super T>action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}}

如果此方法不是默认方法,并且已经添加到Iterable接口,它将强制所有实现此接口的类(通过Collection接口)来实现此方法,因此将破坏所有这些类。 因此,为了使像forEach方法的代码在不破坏现有代码的情况下工作,JDK 1.8中引入了默认方法。

感谢您阅读Java 8语言功能。如果您认为它有用,请共享它,以便其他人也可以从中受益。

翻译自: https://www.javacodegeeks.com/2018/06/java-8-language-features-nutshell-part-1.html

nutshell

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

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

相关文章

windows server 2008 R2 命令行的方式创建用户、设置密码

一、使用命令行的方式创建用户、设置密码 &#xff08;1&#xff09;标准格式&#xff1a; net user username password / add 例如&#xff1a;建立一个名为lijunxuan、密码为Abc_123的用户 net user lijunxuan Abc_123 /add 二、使用命令行修改旧帐户的密码 &#xff…

IntelliJ IDEA for Mac的快速切换当前主题方案(Quick switch current scheme)

文章目录一、配色方案 &#xff08;Color Scheme&#xff09;二、代码样式方案&#xff08;Code Style Scheme&#xff09;三、键映射表&#xff0c;即快捷键方案&#xff08;Keymap&#xff09;四、视图模式/查看模式/显示模式&#xff08;View Mode&#xff09;五、界面外观&…

jpa避免n+1_JPA技巧:避免N + 1选择问题

jpa避免n1介绍 像JPA这样的ORM框架通过帮助我们在对象<->关系数据映射期间避免了很多样板代码&#xff0c;从而简化了我们的开发过程。 但是&#xff0c;它们还给表带来了一些其他问题&#xff0c;N 1是其中之一。 在本文中&#xff0c;我们将简要介绍该问题以及避免这些…

Windows server 2008 基础知识

1、Windows server 2008 安装形式 (1、Virtual (2、Hyper-V (3、VMware 2、对于虚拟内存的大小&#xff0c;建议为实际内存的1.5倍 3、在Windows server 2008系统中安装活动目录的命令是DCPROMO。活动目录存放在域控制器中 4、Windows server 2008支持的两种用户账户&…

Paint X for Mac的用法

文章目录快捷键图形界面介绍快捷键 快捷键说明Command A抓手Command S另存为Command T设置字体Option Command C设置画布大小 Canvas SizeOption Command I设置图像大小 Image SizeShift Command V垂直翻转 Flip VerticalShift Command H水平翻转 Flip HorizontalC…

IntelliJ IDEA for Mac如何替换文件内容中指定的关键词

按下组合键 Shift R 打开替换对话框&#xff08;如下图所示&#xff09;&#xff0c;在对话框中有两个输入框&#xff0c;上面的输入框中输入被替换的关键词&#xff0c;会在指定的范围内查找被替换的关键词&#xff0c;接着在下面的输入框中输入替换的关键词&#xff0c;然后…

海域动态监视监测管理系统_监视和管理备份系统

海域动态监视监测管理系统上一次我们建立一个强大的备份系统时 &#xff0c;现在我们将研究如何监视备份集。 我们需要验证是否正确清理了备份集&#xff08;这称为删除策略&#xff09;&#xff0c;并且它们是一致的&#xff08;称为一致性策略&#xff09;。 备份集可以包含…

Thread 线程同步、线程状态

线程概念 线程&#xff08;英语&#xff1a;thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 一、多线程介绍 1.1创建线程类 Java中通过继承Thread类来创建并启动多线程的步骤如下&#xff1a; 1.定义Thr…

jsp过滤器示例_Java 8过滤器,地图,收集和流示例

jsp过滤器示例大家好&#xff0c;许多读者给我发了电子邮件&#xff0c;写了一篇有关Java 8的地图和过滤器功能的文章&#xff0c;因为他们发现它们难以理解和使用。 即使我以前同时写过有关map&#xff08;&#xff09;和filter&#xff08;&#xff09;的博客&#xff0c;我仍…

IntelliJ IDEA for Mac如何使用单元测试Junit

文章目录测试分类Junit 使用步骤测试结果的判定常用的注解BeforeAfter测试分类 黑盒测试&#xff1a;不需要写代码&#xff0c;不需要关注程序执行具体逻辑和流程&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值 白盒测试&#xff1a;需要写代码&#xff0c;需要…

File类、递归、字节流

一、File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 public File(String pathname) &#xff1a;通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String …

java求期望_Java 11的期望

java求期望过去的几年对Java世界一直是动荡不安的&#xff0c;在相当多的发行版中添加了各种各样的功能。 在开发人员社区中&#xff0c;人们逐渐意识到Java的开发速度不够快。 在最初的20年中&#xff0c;Java平台和Java开发工具包&#xff08;JDK&#xff09;经历了庞大&…

IntelliJ IDEA for Mac 封装字段(添加setter/getter方法)

可以利用 IDEA 对类中的字段进行封装&#xff0c;所谓“字段封装”&#xff0c;就是指通过调用方法的方式来访问字段&#xff0c;而不是直接通过“对象.字段名”的方式去访问。 例如&#xff0c;成员变量 hairColor 是一个 public 的变量&#xff0c;没有相关的 setter/getter…

JDBC预处理对象prepareStatement

JDBC预处理对象prepareStatement概述 一、SQL注入问题 SQL注入&#xff1a;用户输入的内容作为了SQL语句语法的一部分&#xff0c;改变了原有SQL真正的意义。 假设有登录案例SQL语句如下: SELECT * FROM 用户表 WHERE NAME 用户输入的用户名 AND PASSWORD 用户输的密码; 此…

bean包、entity包、mode包、domain包的区别

文章目录beanentitymodeldomain总结bean 包含的都是 JavaBean。 JavaBean 是一种 Java 语言写成的可重用组件。为写成 JavaBean&#xff0c;类必须是具体和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成属性。Jav…

java修改数据历史记录_记录更新(Java数据类)

java修改数据历史记录最近几个月&#xff0c;有一些与“ Java数据类”&#xff08;又称为“记录”&#xff09;有关的更新。 正如我在“ JavaFX&#xff0c;Valhalla&#xff0c;数据类和Java的浮点更新 ”一文中简短提到的那样&#xff0c; Brian Goetz的“ Java数据类 ”“探…

idea配置Maven的本地仓库(打开新的项目时自动更新本地仓库的位置)

配置Maven的本地仓库 一、打开目录然后选择 Other Settings → Settings for New Projects 二、配置自己的文件路径和本地仓库 三、设置每次自动更新本地仓库

java导出数据透视表_使用数据库中的Java流制作数据透视表

java导出数据透视表来自数据库行和表的原始数据不能为人类读者提供太多了解。 相反&#xff0c;如果我们对数据执行某种聚合&#xff0c;则人类更有可能看到数据模式 在向我们展示之前。 数据透视表是聚合的一种特定形式&#xff0c;我们可以在其中应用排序&#xff0c;求平均…

Java程序和MySQL数据库中关于小数的保存问题

文章目录MySQL 中的小数类型decimaldoublefloatJava 中的小数类型floatdoubleBigDecimal金额的计算MySQL 中的小数类型 decimal MySQL 使用 decimal 保存高精度的小数&#xff0c;可以设置保留的小数个数。decimal(m,d)&#xff0c;表示该值一共显示 m 位整数&#xff0c;其中…

javafx 遮罩_JavaFX技巧31:遮罩/剪切/ Alpha通道

javafx 遮罩选择条 最近&#xff0c;我不得不实现一个自定义控件&#xff0c;该控件使用户可以从项目列表中选择一个项目。 此“ SelectionStrip”控件必须水平放置项目&#xff0c;并且在项目过多的情况下&#xff0c;允许用户左右水平滚动。 该控件将在空间受限的区域中使用&…