Jul*_*ian 19 java lambda optional java-8 java-stream
假设我有一个给定名称,姓氏对的地图,我想找到该地图中第一个条目的名称,该名称的姓氏与某个值相匹配.我们如何以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);
}
Run Code Online (Sandbox Code Playgroud)
先感谢您.
Mis*_*sha 55
要在没有匹配项时返回默认值,请使用 Optional#orElse
names.entrySet().stream()
.filter(e -> e.getValue().equals("Donkey"))
.map(Map.Entry::getKey)
.findFirst()
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
52146 次 |
最近记录: |