jdk8 接口默认方法_JDK 8中方便的新地图默认方法

jdk8 接口默认方法

Map接口在JDK 8中提供了一些方便的新方法 。 因为我在本文中介绍的Map方法是作为默认方法实现的,所以Map接口的所有现有实现都享有在默认方法中定义的默认行为,而无需任何新代码。 本文中介绍的JDK 8引入的Map方法是getOrDefault(Object,V) , putIfAbsent(K,V) ,remove(Object,Object), remove(Object,Object) , replace(K,V)和replace(K ,V,V) 。

演示示例图

在本博文的所有示例中,我将使用以下代码中所示的声明和初始化MapstatesAndCapitals字段是类级别的静态字段。 我特意只包含了美国五十个州中的一小部分,以使阅读更清晰,并使某些新的JDK 8 Map默认方法的演示更加容易。

private final static Map statesAndCapitals;static{statesAndCapitals = new HashMap<>();statesAndCapitals.put("Alaska", "Anchorage");statesAndCapitals.put("California", "Sacramento");statesAndCapitals.put("Colorado", "Denver");statesAndCapitals.put("Florida", "Tallahassee");statesAndCapitals.put("Nevada", "Las Vegas");statesAndCapitals.put("New Mexico", "Sante Fe");statesAndCapitals.put("Utah", "Salt Lake City");statesAndCapitals.put("Wyoming", "Cheyenne");}

Map.getOrDefault(Object,V)

Map的新方法getOrDefault(Object,V)允许调用者在单个语句中指定以获取与提供的键对应的映射值,或者如果找不到与提供的键匹配的内容,则返回提供的“默认值”键。

下一个代码清单比较了如何在JDK 8之前实现与映射中提供的键相匹配的值的检查或是否使用默认值(如果未找到匹配项)以及如何在JDK 8中实现它。

/** Demonstrate Map.getOrDefault and compare to pre-JDK 8 approach. The JDK 8* addition of Map.getOrDefault requires fewer lines of code than the* traditional approach and allows the returned value to be assigned to a* "final" variable.*/// pre-JDK 8 approach
String capitalGeorgia = statesAndCapitals.get("Georgia");
if (capitalGeorgia == null)
{capitalGeorgia = "Unknown";
}// JDK 8 approach
final String capitalWisconsin = statesAndCapitals.getOrDefault("Wisconsin", "Unknown");

Apache Commons类DefaultedMap提供的功能类似于新的Map.getOrDefault(Object, V)方法。 Groovy GDK包括一个与Groovy类似的方法Map.get(Object,Object) ,但是它的行为有些不同,因为如果找不到“ key”,它不仅返回提供的默认值,而且还使用基础地图的默认值。

Map.putIfAbsent(K,V)

Map的新方法putIfAbsent(K,V)的 Javadoc公布了等效的默认实现:

The default implementation is equivalent to, for this map:V v = map.get(key);if (v == null)v = map.put(key, value);return v;

另一个代码示例对此进行了说明,该示例将JDK 8之前的方法与JDK 8的方法进行了比较。

/** Demonstrate Map.putIfAbsent and compare to pre-JDK 8 approach. The JDK 8* addition of Map.putIfAbsent requires fewer lines of code than the* traditional approach and allows the returned value to be assigned to a* "final" variable.*/// pre-JDK 8 approach
String capitalMississippi = statesAndCapitals.get("Mississippi");
if (capitalMississippi == null)
{capitalMississippi = statesAndCapitals.put("Mississippi", "Jackson");
}// JDK 8 approach
final String capitalNewYork = statesAndCapitals.putIfAbsent("New York", "Albany");

在StackOverflow线程Java map.get(key)中讨论了在添加putIfAbsent方法之前在Java空间中的替代解决方案–自动执行put(key)并在key不存在时返回? 。 值得注意的是,在JDK 8之前, ConcurrentMap接口(扩展Map )已经提供了putIfAbsent(K,V)方法。

Map.remove(Object,Object)

Map的新删除(对象,对象)方法超出了长可Map.remove(对象)方法来删除一个映射条目仅所提供的密钥,并提供价值相匹配的地图(一个条目以前使用的版本只寻找要删除的“关键”匹配项)。

此方法的Javadoc注释根据等效的JDK 8之前的Java代码说明了默认方法的实现方式:
此映射的默认实现等效于:

if (map.containsKey(key) && Objects.equals(map.get(key), value)) {map.remove(key);return true;} elsereturn false;

下一个代码清单中显示了新方法与JDK 8之前方法的具体比较。

/** Demonstrate Map.remove(Object, Object) and compare to pre-JDK 8 approach.* The JDK 8 addition of Map.remove(Object, Object) requires fewer lines of* code than the traditional approach and allows the returned value to be* assigned to a "final" variable.*/// pre-JDK 8 approach
boolean removed = false;
if (   statesAndCapitals.containsKey("New Mexico")&& Objects.equals(statesAndCapitals.get("New Mexico"), "Sante Fe"))
{statesAndCapitals.remove("New Mexico", "Sante Fe");removed = true;
}// JDK 8 approach
final boolean removedJdk8 = statesAndCapitals.remove("California", "Sacramento");

Map.replace(K,V)

两个新的Map “替换”方法中的第一个方法仅在指定键已经存在且具有某些映射值的情况下,才将指定值设置为映射到指定键。 Javadoc注释说明了此默认方法实现的Java等效项:
此映射的默认实现等效于:

if (map.containsKey(key)) {return map.put(key, value);} elsereturn null;

接下来显示此新方法与JDK 8之前的方法的比较。

/** Demonstrate Map.replace(K, V) and compare to pre-JDK 8 approach. The JDK 8* addition of replace(K, V) requires fewer lines of code than the traditional* approach and allows the returned value to be assigned to a "final" * variable.*/// pre-JDK 8 approach
String replacedCapitalCity;
if (statesAndCapitals.containsKey("Alaska"))
{replacedCapitalCity = statesAndCapitals.put("Alaska", "Juneau");
}// JDK 8 approach
final String replacedJdk8City = statesAndCapitals.replace("Alaska", "Juneau");

Map.replace(K,V,V)

第二个新添加的Map “替换”方法在解释哪些现有值被替换时更窄。 尽管刚刚介绍的方法将替换映射中可用于指定键的值中的任何值,但是这种接受附加( 第三个 )参数的“替换”方法将仅替换同时具有匹配键键的已映射条目的值。匹配值。 Javadoc注释显示了默认方法的实现:

The default implementation is equivalent to, for this map:if (map.containsKey(key) && Objects.equals(map.get(key), value)) {map.put(key, newValue);return true;} elsereturn false;

下一个代码清单显示了我对该方法与JDK 8之前的方法的比较。

/** Demonstrate Map.replace(K, V, V) and compare to pre-JDK 8 approach. The* JDK 8 addition of replace(K, V, V) requires fewer lines of code than the* traditional approach and allows the returned value to be assigned to a* "final" variable.*/// pre-JDK 8 approach
boolean replaced = false;
if (   statesAndCapitals.containsKey("Nevada")&& Objects.equals(statesAndCapitals.get("Nevada"), "Las Vegas"))
{statesAndCapitals.put("Nevada", "Carson City");replaced = true;
}// JDK 8 approach
final boolean replacedJdk8 = statesAndCapitals.replace("Nevada", "Las Vegas", "Carson City");

观察与结论

从这篇文章中可以得出一些结论。

  • 这些新的JDK 8 Map方法的Javadoc方法非常有用,特别是在描述新方法如何按照JDK 8之前的代码表现时。 我在有关基于JDK 8 Javadoc的API文档的更一般性讨论中讨论了这些方法的Javadoc。
  • 正如这些方法的Javadoc注释中的等效Java代码所指示的那样,这些新方法通常在访问映射键和值之前不检查null。 因此,使用Javadoc注释中所示的“等效”代码时,使用这些方法可能会遇到与null相同的问题。 实际上,Javadoc注释通常会警告NullPointerException的可能性,以及与某些Map实现允许null以及某些键和值不允许的问题有关的问题。
  • 本文中讨论的新Map方法是“默认方法”,这意味着Map实现会自动“继承”这些实现。
  • 本文中讨论的新Map方法允许使用更简洁的代码。 在我的大多数示例中,它们允许将客户端代码从多个影响状态的语句转换为可以一次性设置局部变量的单个语句。

这篇文章中介绍的新Map方法不是突破性的或破天荒的,但它们为许多Java开发人员以前实现了更多详细代码,为其编写了自己的相似方法或为第三方库提供了便利。 JDK 8将这些标准化方法带给了Java大众,而无需自定义实现或第三方框架。 因为默认方法是实现机制,所以即使已经存在了很长时间的Map实现也突然并自动访问了这些新方法,而无需对实现进行任何代码更改。

翻译自: https://www.javacodegeeks.com/2014/04/handy-new-map-default-methods-in-jdk-8.html

jdk8 接口默认方法

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

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

相关文章

什么是千兆光纤收发器?其产品标准具体有哪些?

现如今&#xff0c;千兆网技术已成为新建网络和改造的首选技术&#xff0c;虽然对综合布线系统的性能要求也提高&#xff0c;但是却给用户的使用和以后的升级提供便利。千兆光纤收发器又名光电转换器&#xff0c;是一种快速以太网&#xff0c;其数据传输速率达1Gbps,仍采用CSMA…

[渝粤教育] 南方医科大学 医学统计学 参考 资料

教育 -单元机组集控运行A-汪淑奇-热动3-4班-章节资料考试资料-长沙理工大学【】 随堂测验 教育 -医学统计学-章节资料考试资料-南方医科大学【】 第一章单元测试 1、【单选题】 调查某地1000人发汞水平&#xff0c;以发汞含量小于2.6 μg/kg 为正常&#xff0c;大于等于这个值…

微信公众号如何增加查题功能(无广告查题)

这几天很多小伙伴都不知道怎么将查题的功能绑定到自己机构的微信公众号上&#xff0c;林林总总收到了很多小伙伴的反馈&#xff0c;现在直接给各位发送操作流程&#xff0c;希望大家一次性绑定上&#xff01;&#xff08;流程之后还有一些解答&#xff09; 1&#xff1a;网址&a…

千兆光纤收发器调整措施

千兆光纤收发器&#xff08;又名光电转换器&#xff09;是一种快速以太网&#xff0c;其数据传输速率达1Gbps,仍采用CSMA/CD的访问控制机制并与现有的以太网兼容&#xff0c;在布线系统的支持下&#xff0c;可以使原来的快速以太网平滑升级并能充分保护用户原来的投资。那么&am…

Spring Boot YAML配置

在本快速教程中&#xff0c;我们将学习如何使用YAML文件来配置Spring Boot应用程序的属性。 什么是YAML文件&#xff1f; 除了可以在Spring中没有应用程序.properties之外 &#xff0c;我们还可以使用application.yml作为配置文件。 YAML是JSON的超集&#xff0c;我们可以将其…

千兆网综合布线系统的线缆选型

综合布线系统包含建筑群布线子系统、建筑物主干布线子系统、水平布线子系统&#xff08;包含工作区电缆&#xff09;三大布线子系统。千兆网综合布线系统除具有一般快速以太网综合布线系统设计的特点之外&#xff0c;更重要的是要合理选择UTP、光缆及接插件。 1、光缆的选择 光…

hibernate数据类型_Hibernate类型初学者指南

hibernate数据类型基本映射概念 学习Hibernate时&#xff0c;许多人喜欢跳到父子关联&#xff0c;而无需掌握对象关系映射的基础知识。 在开始对实体关联进行建模之前&#xff0c;了解各个实体的基本映射规则非常重要。 Hibernate类型 Hibernate类型是SQL类型和Java原语/对象类…

如何快速区分单模与多模光纤收发器?

现如今&#xff0c;光纤收发器的应用范围是越来越广泛了&#xff0c;但是市场上大多数品牌的光纤收发器外观都差不多&#xff0c;那么&#xff0c;我们在使用光纤收发器的过程中该如何辨别单模和多模光纤收发器呢&#xff1f;接下来就跟随飞畅科技的小编一起来详细了解下吧&…

什么是HDMI光纤延长器?其应用场合有哪些?

在信号数据传输中&#xff0c;我们常常听到的都是光模块、光纤、光缆等器件&#xff1b;在本文中&#xff0c;杭州飞畅科技给大家介绍的是另外一款数据传输产品——光纤延长器。那么&#xff0c;到底什么是光纤延长器呢&#xff1f;它应用场合有哪些呢&#xff1f;接下来我们就…

Spring与Rails的jQuery UJS

我一直想尝试一下是否可以在Spring Boot项目中使用Rails的jQuery UJS 。 jquery-ujs中的UJS代表不引人注目JavaScript 。 我非常喜欢UJS如何将事件处理程序连接到标记有HTML5 data-*属性的合格DOM元素。 我发现自己希望看到更多在Spring Boot Web应用程序中使用的这种方法。 我…

什么是VGA光纤收发器?

采用先进的非压缩数字高清视频和高速数字光纤传输技术&#xff0c;可以轻松地将计算机主机、高清视频信号源、高清DVD/DVR等设备输出的各种分辨率的VGA高清视频信号长距离传输到远端的器件。那么&#xff0c;VGA光纤收发器的产品特点及技术参数有哪些呢&#xff1f;接下来我们就…

akka使用_使用Akka简化交易系统

akka使用我的同事正在开发一种交易系统&#xff0c;该系统可以处理大量的传入交易。 每笔交易都涵盖一种Instrument &#xff08;例如债券或股票&#xff09;&#xff0c;并且具有某些&#xff08;现在&#xff09;不重要的属性。 他们坚持使用Java&#xff08;<8&#xff0…

浅析HDMI1.4光纤延长器的工作原理和应用领域

HDMI光纤延长器是用来延长信号的传输器件&#xff0c;解决HDMI音视频信号无法远距离传输的问题&#xff0c;且保证信号传输的质量。那么&#xff0c;HDMI光纤延长器的工作原理是什么&#xff1f;HDMI光纤延长器有哪些应用呢&#xff1f;接下来就由飞畅科技的小编来为大家详细介…

Java中的模板方法模式

模板方法模式是一种行为模式&#xff0c;建议在超类中更一般地定义算法。 该算法是在称为模板方法的方法中定义的。 子类仅定义更具体的算法步骤的实现。 使用这种设计模式的好处是&#xff0c;算法后面的任何更改只会影响超类中的代码。 此外&#xff0c;它还可以提高代码的可…

什么是单模单纤/双纤光纤收发器?

光纤收发器&#xff0c;是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元&#xff0c;按其所需主要分为单纤光纤收发器和双纤光纤收发器&#xff0c;接下来我们就来详细介绍下什么是单模单纤/双纤光纤收发器&#xff1f;单模单纤和单模双纤光纤收…

什么是以太网光纤收发器,其产品特点和技术参数都有哪些?

以太网光纤收发器是一款提供以太网数据信号到光纤数据信号的双向透明转换器&#xff0c;可以将以太网信号通过光纤线路传输突破传输距离100米的限制&#xff0c;使得以太网网络覆盖得到极大的延伸。光纤收发器的出现&#xff0c;确保能够顺畅的将电信号与光纤信号相互转换&…

什么是CAN总线中继器?

CAN网桥&#xff08;Bridge&#xff09;是一个智能的中继器。使用CAN网桥对设备进行互连&#xff0c;克服了CAN总线结点个数及通信距离的物理限制&#xff0c;能有效扩充CAN网络的结点总数&#xff0c;延长通信距离。今天&#xff0c;飞畅科技的小编为大家详细介绍下CAN总线中继…

java百里香_百里香Spring测试的意见

java百里香我最近在基于Spring的Web应用程序中转换为thymeleaf以进行视图模板化&#xff0c;而不是jsp。 百里香叶文档中关于为什么百里香叶在jsp上为什么能保持水分的所有争论&#xff0c;我肯定被卖掉了。 除了能够预览模板之外&#xff0c;对我来说&#xff0c;主要原因之一…

一文读懂工业设备的两种通讯方式:现场总线和工业以太网

随着传统制造企业正在加快智能制造转型的进程&#xff0c;工业互联网迅速在全世界范围内兴起。在工业互联网的技术构架中&#xff0c;通过各类通讯方式接入不同设备、系统和产品&#xff0c;来采集海量数据是其重要的一环。本文将重点介绍工业底层设备的两种通讯方式&#xff1…

Java中的中介器设计模式

在本教程中&#xff0c;我们将学习一种行为模式&#xff0c;该行为模式将促进彼此通信的多个对象之间的松散耦合。 Mediator设计模式背后的想法是拥有一个中心对象&#xff0c;该对象封装了一组对象之间的交互方式。 在调解器模式中&#xff0c;我们在称为调解器的单独类中提取…