Dưới đây là hai ví dụ. Cả hai đều in khóa dựa trên đối sánh trong thuộc tính của giá trị.
private static void printMatchingEntriesUsingALoop(Map<String, Map<String, String>> resMap, String key, String value) {
for (Map.Entry<String, Map<String, String>> entry : resMap.entrySet())
if (value.equals(entry.getValue().get(key)))
System.out.println(entry.getKey());
}
private static void printMatchingEntriesUsingGuava(Map<String, Map<String, String>> resMap, final String key, final String value) {
Predicate<Map<String, String>> keyValueMatch =
new Predicate<Map<String, String>>() {
@Override
public boolean apply(@Nullable Map<String, String> stringStringMap) {
return value.equals(stringStringMap.get(key));
}
};
Maps.EntryTransformer<String, Map<String, String>, Void> printKeys =
new Maps.EntryTransformer<String, Map<String, String>, Void>() {
@Override
public Void transformEntry(@Nullable String s,
@Nullable Map<String, String> stringStringMap) {
System.out.println(s);
return null;
}
};
Maps.transformEntries(Maps.filterValues(resMap, keyValueMatch), printKeys);
}
public static void main(String... args) {
Map<String, Map<String, String>> resMap = new TreeMap<String, Map<String, String>>();
printMatchingEntriesUsingALoop(resMap, "first", "mike");
printMatchingEntriesUsingGuava(resMap, "first", "mike");
}
Một sử dụng vòng lặp và một lần sử dụng Ổi.
Trong khi phiên bản đầu tiên hoạt động tốt hơn, bạn nên thực sự quyết định cái nào sẽ dễ hiểu và dễ bảo trì nhất.
Một số đề xuất từ @missingfaktor. Bạn phải sử dụng bản án của riêng bạn, nhưng ông đã nêu bật một số vấn đề tốt.
- nhiều lần sao chép mã.
- xử lý trường hợp đặc biệt.
- Độ phức tạp của chu trình khác.
- Nhiều cơ hội lỗi hơn, do kết quả của ba dấu đầu tiên.
- Khó theo dõi mã.
Hãy tưởng tượng bạn là nhà phát triển mới, những người phải hỗ trợ phần mềm này. Mà bạn muốn được đối mặt?
Bạn cần một số loại LINQ tương đương DotNet trong Java ... – Wins
Tại sao bạn muốn tránh một vòng lặp? Bất cứ điều gì bạn sử dụng cũng giống như sử dụng vòng lặp cho bạn. –
Nhận xét nhỏ: chuyển đổi thứ tự trong bằng, vì get ("mike") có thể trả về giá trị rỗng. tức là 'if (" jordan ".equals (el.getValue(). get (" mike "))' – user949300