Java Потоки, как проверить нулевые значения и отправить сообщение при отображении нового списка - PullRequest
0 голосов
/ 14 марта 2020

Так что я в основном пытаюсь выяснить, есть ли способ избежать использования одного и того же кода дважды, а также получить ключ в том месте, где я получаю синтаксическую ошибку.

List<String> listOfKeys = new ArrayList<>(
    Arrays.asList("key1", "key2", "key3", "key4", "key5"));
String path = "something.something.";

listOfKeys.stream()
    .map(key -> path + key)
    .map(getConfig()::getString)
    .forEach(value -> { 
        if (value == null || value.isEmpty()) 
            getLogger().info(key + " is empty"); 
    }); 

List<String> listOfValue = listOfKeys.stream()
    .map(key -> path + key)
    .map(getConfig()::getString)
    .collect(Collectors.toList());

I знаю, что ключ в методе журнала является синтаксической ошибкой, но мне интересно, как я смогу получить доступ к ключу в этой точке и отправить сообщение с ключом который имел нулевое значение? Также возможно ли сделать все это при создании listOfValues во втором потоке?

1 Ответ

1 голос
/ 15 марта 2020

Вы можете использовать peek. Он оценивает блок кода и продолжает потоковую передачу:

List<String> listOfValue = listOfKeys.stream()
    .map(key -> path + key)
    .map(getConfig()::getString)
    .peek(value -> { 
        if (value == null || value.isEmpty()) 
            getLogger().info(key + " is empty"); 
    })
    .collect(Collectors.toList());

Если вы хотите использовать ключ при ведении журнала, вы можете использовать Map.Entry:

List<String> listOfValue = listOfKeys.stream()
    .map(key -> new AbstractMap.SimpleEntry(key, getConfig().getString(path + key))
    .peek(entry -> { 
        if (entry.getValue() == null || entry.getValue().isEmpty()) 
            getLogger().info(entry.getKey() + " is empty"); 
    })
    .map(AbstractMap.SimpleEntry::getValue)
    .collect(Collectors.toList());
...