java 8 фильтрует ListOfMap для проверки, существует ли ключ, если существует, тогда собираем карту - PullRequest
0 голосов
/ 27 февраля 2019

Ниже приведен код для сбора listofmap из результирующего набора и проверки listofmap для продукта с перкулярным изображением. Если продукт существует, получите эту карту.Пожалуйста, помогите мне сделать это в java8

List<Map<String,Object>>    lmProducts  =   new ArrayList<Map<String, Object>>();
Map<String, Object>         map         =   null;
try {
    if(resultSet.next()){
        System.out.println("PRODUCT\t PRICE\t QUANTITY");
        do{
            map  =   new HashMap<String, Object>();
            map.put("NAME", resultSet.getString("NAME"));
            map.put("PRICE", resultSet.getString("PRICE"));
            map.put("QUANTITY", resultSet.getString("QUANTITY"));
            System.out.println(resultSet.getString("NAME")+"\t "+resultSet.getInt("PRICE")+"\t "+resultSet.getInt("QUANTITY"));
            lmProducts.add(map);
        }while (resultSet.next());
    }

}catch (SQLException e){
    System.out.println("Exception while processing Resultset: "+e.toString());
}

// Попытка получить карту mProduct, проверив ключевое условие

Map<String, Object> mProductMap     =   new HashMap<String, Object>();
mProductMap     =   lmProducts.stream().filter(m -> m.get("NAME").toString().equalsIgnoreCase(sProductName)).collect(to)

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вы также можете сделать это, так как Map имеет уникальную проверку пары ключ-значение Map содержит этот ключ и значение, затем соберите его в Map

Map<String,Object> result = list.stream()
    .filter(m->m.containsKey("NAME") && m.get("NAME").toString().equalsIgnoreCase(sProductName))    // check map contains that key and value
         .collect(Collectors.toMap(key->"NAME",value->value.get("NAME")));  //collect it to Map

Примечание Предположим, что если в списке есть два объекта карты с одним и тем же ключом, он выдаст исключение

java.lang.IllegalStateException: Duplicate key NAME

Поэтому, чтобы игнорировать этот случай, используйте функцию слияния toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)

.collect(Collectors.toMap(key->"NAME",value->value.get("NAME"), (v1,v2)->v1));
0 голосов
/ 27 февраля 2019

Если я получу ваш код правильно, вы ищете что-то вроде этого:

Predicate<Map<String, Object>> hasExpectedName = 
    prod -> prod.containsKey("NAME") && prod.get("NAME").toString().equalsIgnoreCase(sProductName);

Map<String, Object> mProductMap = 
    lmProducts.stream()
              .filter(hasExpectedName)
              .findFirst()
              .orElse(null);    // <= return null or a default value
           // .orElseThrow(...) // <= or you can throw an exception if you want

Хотя я бы сделал в несколько более стиле ООП:

Определитекласс для хранения данных продукта:

static class Product {
    private String name;
    private String price;
    private String quantity;

    // Constructor & setters & getters
}

, затем извлечение данных в объекты продукта:

// ...
System.out.println("PRODUCT\t PRICE\t QUANTITY");
do {
    product = new Product(
        resultSet.getString("NAME"),
        resultSet.getString("PRICE"),
        resultSet.getString("QUANTITY")
    );
    // System.out.println(...);
    products.add(product);
} while (resultSet.next());
// ...

Теперь операции с потоками довольно просты:

Product product = products.stream()
                          .filter(p -> p.getName().equalsIgnoreCase(sProductName))
                          .findFirst()   // or .findAny()
                          .orElse(null); // or a default value
0 голосов
/ 27 февраля 2019

Вы можете collect, используя Collectors.toMap на всех записях, объединенных с Map.

Map<String, Object> mProductMap = lmProducts.stream()
        .flatMap(a -> a.entrySet().stream()) // stream of entries of all maps
        // entries with specific key and value combination
        .filter(m -> m.getKey().equals("NAME") && m.getValue().toString().equalsIgnoreCase(sProductName)) 
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
...