Sonarlint предлагает «Рефакторинг кода для использования потокового конвейера» - PullRequest
0 голосов
/ 27 января 2020

Я использовал потоковый подход, чтобы уменьшить - List<Map<String,String>> до List<CustomObject>. Следующий код был использован для потока

List<Map<String,String>> mailVariable = (List<Map<String, String>>) processVariables.get("MAIL_MAP");

1| List<CustomObject> detList = mailVariable
2|                                      .stream()
3|                                      .flatMap(getEntry)
4|                                      .filter (isEmpty)
5|                                      .reduce(new ArrayList<CustomObject>(),accumulateToCustomObject,combiner);

Я анализировал свой код с помощью sonarLint и получил следующую ошибку в строке 2 и 3

Рефакторинг этого кода, чтобы поток конвейер используется. squid: S3958

Я использую поток и получаю значение из операции терминала, как предложено здесь . Что-то я делаю не так? Может ли кто-нибудь предложить правильный способ написания этого кода?

// following are the functional interface impls used in the process

Function<Map<String,String>, Stream<Entry<String,String>>> getEntry = data -> data.entrySet().stream();

Predicate<Entry<String, String>> isEmpty                            = data -> data.getValue() != null
                                                                                    || !data.getValue().isEmpty() 
                                                                                    || !data.getValue().equals(" ");

BinaryOperator<ArrayList<CustomObject>> combiner                = (a, b) -> {
                                                                                ArrayList<CustomObject> acc = b;
                                                                                acc.addAll(a);
                                                                                return acc;
                                                                            };

BiFunction<ArrayList<CustomObject>,Entry<String,String>,ArrayList<CustomObject>> accumulateToCustomObject = (finalList, eachset) -> {
                /* reduction process happens            
                   building the CustomObject..
                */
                return finalList;
            };

1 Ответ

0 голосов
/ 27 января 2020

Обновление :: Я нашел обходной путь к этой проблеме, разбив мою операцию уменьшения карты на карту и собирая операцию следующим образом. Эта конкретная ошибка ворса появляется сейчас

List<AlertEventLogDetTO> detList = mailVariable
                                                    .stream()
                                                    .flatMap(getEntry)
                                                    .filter (isEmpty)
                                                    .map(mapToObj)
                                                    .filter(Objects::nonNull)
                                                    .collect(Collectors.toList());

Function<Entry<String,String>,AlertEventLogDetTO> mapToObj = eachSet -> {
                String tagString = null;
                String tagValue  = eachSet.getValue();

                try{
                    tagString = MapVariables.valueOf(eachSet.getKey()).getTag();
                } catch(Exception e){
                    tagString = eachSet.getKey();
                }

                if(eventTags.contains(tagString)){
                    AlertEventLogDetTO entity = new AlertEventLogDetTO();
                    entity.setAeldAelId(alertEventLog.getAelId());
                    entity.setAelTag(tagString);
                    entity.setAelValue(tagValue);

                    return entity;
                }

                return null;
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...