数据库作业代做网站,svg图片做网站背景,企业网站趋势,网络营销的常用方法有哪些jdk8 接口默认方法Map接口在JDK 8中提供了一些方便的新方法 。 因为我在本文中介绍的Map方法是作为默认方法实现的#xff0c;所以Map接口的所有现有实现都享有在默认方法中定义的默认行为#xff0c;而无需任何新代码。 本文中介绍的JDK 8引入的Map方法是getOrDefault#… jdk8 接口默认方法 Map接口在JDK 8中提供了一些方便的新方法 。 因为我在本文中介绍的Map方法是作为默认方法实现的所以Map接口的所有现有实现都享有在默认方法中定义的默认行为而无需任何新代码。 本文中介绍的JDK 8引入的Map方法是getOrDefaultObjectV putIfAbsentKV removeObjectObject removeObjectObject replaceKV和replaceK VV 。 演示示例图 在本博文的所有示例中我将使用以下代码中所示的声明和初始化Map 。 statesAndCapitals字段是类级别的静态字段。 我特意只包含了美国五十个州中的一小部分以使阅读更清晰并使某些新的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.getOrDefaultObjectV Map的新方法getOrDefaultObjectV允许调用者在单个语句中指定以获取与提供的键对应的映射值或者如果找不到与提供的键匹配的内容则返回提供的“默认值”键。 下一个代码清单比较了如何在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.getObjectObject 但是它的行为有些不同因为如果找不到“ key”它不仅返回提供的默认值而且还使用基础地图的默认值。 Map.putIfAbsentKV Map的新方法putIfAbsentKV的 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.getkey中讨论了在添加putIfAbsent方法之前在Java空间中的替代解决方案–自动执行putkey并在key不存在时返回 。 值得注意的是在JDK 8之前 ConcurrentMap接口扩展Map 已经提供了putIfAbsentKV方法。 Map.removeObjectObject 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.replaceKV 两个新的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.replaceKVV 第二个新添加的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.htmljdk8 接口默认方法