Я хочу найти значение, присутствующее на карте или нет у меня вот такая карта
Map<String, Object> eMap = new HashMap<String, Object>();
Set<String> wList = new HashSet<>();
eMap.put("DATA LIST", wList);
предполагая, что набор содержит ['aaa', 'bbb']; как проверить наличие «ааа» на карте?
Спасибо. :)




В вашем примере eMap будет типа Map<String, List<String>>. Это было бы намного проще. Затем вам придется перебирать значения для проверки:
eMap.values().stream().anyMatch(l -> l.contains("aaa"));
И определение карты:
Map<String, Set<String>> eMap = new HashMap<>();
Я считаю, что это должно быть Map<String, Set<String>> не Map<String, List<String>>
Map<String, Set<String>> eMap = new HashMap<>();
Set<String> wList = new HashSet<>();
wList.add("aaa");
wList.add("bbb");
eMap.put("DATA LIST", wList);
System.out.println(
eMap.values().parallelStream().flatMap(set -> set.stream()).anyMatch(set -> set.contains("bbb")));
Если вы хотите искать значения в наборах вашей карты, это работает следующим образом. Вы сопоставляете все наборы с одним потоком, а затем проверяете, присутствует ли искомое значение.
Также рекомендую использовать
Map<String, Set<String>>
вместо
Map<String, Object>
потому что тогда вам не нужно будет приводить (безопасность типа)
Вы можете использовать функцию потокового API Java 8.
eMap.entrySet().stream().filter(e -> e.getValue().contains('aaa'))
Затем данные могут быть сохранены в новой карте или списке или как угодно.
Вы можете проверить это следующим образом:
Использование Java 8:
public static boolean checkValueExists(Map<String, Object> eMap, String searchedValue){
return eMap.values().parallelStream()
.flatMap(set -> ((Set<String>)set).stream())
.anyMatch(set -> set.contains(searchedValue));
}
Нормальный путь:
public static boolean checkValueExists(Map<String, Object> eMap, String searchedValue){
for (Map.Entry<String, Object> item : eMap.entrySet()) {
String key = item.getKey();
Set<String> setValue = (Set<String>) item.getValue();
if (setValue.contains(searchedValue)){
return true;
}
}
return false;
}
Здесь вам нужно повторить Map<String, Object> eMap . Получите его значение, которое равно Set<String>. Теперь вам нужно найти setValue для searchedValue.
Вот набор данных:
Map<String, Object> eMap = new HashMap<>();
Set<String> numberList = new HashSet<>();
numberList.add("Number 1");
numberList.add("Number 2");
numberList.add("Number 3");
eMap.put("Number LIST", numberList);
Set<String> fruitList = new HashSet<>();
fruitList.add("Apple");
fruitList.add("Banana");
fruitList.add("Tomato");
eMap.put("Fruit LIST", fruitList);
String searchedValue = "Number 3";
System.out.println("Is Value exists :"+checkValueExists(eMap,searchedValue));
Я бы не рекомендовал использовать parallelStream() против stream(), если нет реальной причины для использования.
Не может быть
Map<String, List<String>>? Это было бы намного проще