Найти первую подходящую запись и назначить соответствующее значение записи переменной - PullRequest
3 голосов
/ 17 марта 2020

Если хотите присвоить значение переменной с помощью фильтра и сначала найти (чтобы избежать совпадения покоя и сохранения итерации).

String output = ""

Map<String, Map<String, CustomObj>> finalMap = new LinkedHashMap<>();;

Map<String, CustomObj> isinMap = new HashMap<>();
isinMap.put("REL", new CustomObj("RELIANCE ISIN"));
isinMap.put("AXIS", new CustomObj("AXISBANK ISIN"));

Map<String, CustomObj> cusipMap = new HashMap<>();
cusipMap.put("CREL", new CustomObj("RELIANCE CUSIP"));
cusipMap.put("CAXIS", new CustomObj("AXISBANK CUSIP"));


finalMap.put("ISIN",isinMap);
finalMap.put("CUSIP",cusipMap);


Map<String,String> tradeDetails = new HashMap<>();
tradeDetails.put("ISIN","AXIS");
tradeDetails.put("CUSIP","AXIS2");


finalMap.entrySet().stream().filter(finalMapEntry-> {
String value = tradeDetails.get(finalMapEntry.getKey());
return finalMapEntry.getValue().containsKey(value);

        // I want following
        //output = finalMapEntry.getValue().get(value).get(); //output should be AXISBANK ISIN
    }
).findFirst();

Я знаю, findFirst() вернет мне первую запись в Optional но я хочу, чтобы значение внутреннего ключа карты было присвоено выходной переменной. Возможно ли сделать это как-то во время потоковой передачи, а также пропустить другие итерации, если совпадение найдено с первой или n-й попытки?

Ответы [ 3 ]

3 голосов
/ 17 марта 2020

Можно эффективно использовать API getOrDefault здесь как:

String value = tradeDetails.entrySet()
        .stream()
        .map(trade -> finalMap.getOrDefault(trade.getKey(), Collections.emptyMap())
                .get(trade.getValue()))
        .filter(Objects::nonNull)
        .findFirst() // find first non null element (existence in Map as key-value)
        .map(CustomObj::getDesc) // as you need the description
        .orElse("");
1 голос
/ 17 марта 2020

Вы можете сделать так:

tradeDetails.entrySet().stream()
       .map(entry -> new AbstractMap.SimpleEntry<>(entry.getValue(),
                                                   finalMap.get(entry.getKey())))
       .map(entry -> entry.getValue().get(entry.getKey()))
       .filter(Objects::nonNull)
       .map(CustomObj::getName)
       .findFirst().orElse("");

или

finalMap.entrySet().stream() 
         // .filter(entry -> tradeDetails.keySet().contains(entry.getKey()))
            .map(m -> m.getValue().get(tradeDetails.get(m.getKey())))
            .filter(Objects::nonNull)
            .findFirst()
            .map(CustomObj::getName)
            .orElse("");
0 голосов
/ 17 марта 2020

Использовать карту?

Optional<CustomObj> cObjectOpt = finalMap.keySet().stream().filter(k->finalMap.get(k).containsKey(tradeDetails.get(k))).findFirst().map(fk->finalMap.get(fk).get(tradeDetails.get(fk)));
        if(cObjectOpt.isPresent()) {
            System.out.println(cObjectOpt.get().get()); 
        }
...