假设我有一个给定名称,姓氏对的映射,并且我想在该映射中找到姓氏与某个值匹配的第一个条目的给定名称。我们将如何以Java 8的方式做到这一点。
在下面的测试案例示例中,我提出了两种实现方法。
但是,第一个(寻找姓氏为“ Donkey”的第一个人的给定名称)将抛出java.util.NoSuchElementException:没有值,因此不安全。
第二个可以工作,但不仅不易阅读,而且功能还不太完善。
只是不知道是否有人在这里会建议我实现这个要么使用一个更简单更清晰的方式stream()
或forEach()
或两者兼而有之。
@Test
public void shouldBeAbleToReturnTheKeyOfTheFirstMatchingValue() throws Exception {
Map<String, String> names = new LinkedHashMap<>();
names.put("John", "Doe");
names.put("Fred", "Flintstone");
names.put("Jane", "Doe");
String keyOfTheFirst = names.entrySet().stream().filter(e -> e.getValue().equals("Doe")).findFirst().get().getKey();
assertEquals("John", keyOfTheFirst);
try {
names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst().get();
} catch (NoSuchElementException e){
// Expected
}
Optional<Map.Entry<String, String>> optionalEntry = names.entrySet().stream().filter(e -> e.getValue().equals("Donkey")).findFirst();
keyOfTheFirst = optionalEntry.isPresent() ? optionalEntry.get().getKey() : null;
assertNull(keyOfTheFirst);
}
先感谢您。
要在没有匹配项的情况下返回默认值,请使用 Optional#orElse
names.entrySet().stream()
.filter(e -> e.getValue().equals("Donkey"))
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句