假设我有一个给定名称,姓氏对的地图,并且我想要找到该地图中具有匹配一定值的姓氏的第一个条目的给定名称.
我们将如何以 java 8方式做到这一点.
我们将如何以 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);