Giả sử tôi có một bản đồ cho tên, họ và cặp tôi muốn tìm tên đã cho của mục nhập đầu tiên trong bản đồ có họ khớp với một giá trị nhất định. Làm thế nào chúng ta sẽ làm điều này trong một thời trang java 8.Java 8 trích xuất khóa đầu tiên từ khớp với giá trị trong một Bản đồ
Trong ví dụ trường hợp thử nghiệm của tôi bên dưới, tôi đặt hai cách để thực hiện.
Tuy nhiên, tên đầu tiên (tìm tên đã cho của người đầu tiên có họ "Donkey") sẽ ném java.util.NoSuchElementException: Không có giá trị hiện tại để không an toàn.
Tác phẩm thứ hai hoạt động nhưng không chỉ khó đọc hơn mà còn hơi khó thực hiện chức năng.
Chỉ cần tự hỏi liệu có ai đó ở đây sẽ gợi ý cho tôi cách dễ dàng hơn để đạt được điều này bằng cách sử dụng stream()
hoặc forEach()
hoặc cả hai.
@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);
}
Cảm ơn bạn trước.
Rõ ràng sử dụng bản đồ hai chiều sẽ hiệu quả hơn. –
Mã này [mùi] (http://en.wikipedia.org/wiki/Code_smell). Thiết kế kém. –
Xin chào patryk. Tôi hoàn toàn đồng ý với bạn. Đây là lý do tại sao tôi đăng câu hỏi. Bạn có thể cung cấp giải pháp không? – Julian