当前位置: 首页 > 知识库问答 >
问题:

Sonarint提示“重构代码以便使用流管道”

魏明亮
2023-03-14

我使用了一种基于流的方法来映射并减少我的列表

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行得到以下错误

重构此代码,以便使用流管道。鱿鱼:S3958

事实上,我正在使用stream并从这里建议的终端操作中返回值。我做错什么了吗?。有谁能建议正确的代码编写方法吗?

// 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个答案

鞠源
2023-03-14

更新::我找到了一个解决此问题的方法,将map reduce操作拆分为map和collect操作,如下所示。现在出现了特定的lint错误

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;
            };
 类似资料:
  • 我正在从事一个项目(Java 17),其中我有一个对象列表,其中有两个属性,

  • 在模板中使用自定义管道时,如下所示: 而且效果很好。 但它表明 用户名未定义

  • 使用 Dreamweaver 的代码提示和代码完成功能,最大限度缩短编码时间。 Dreamweaver 的智能代码完成或代码提示功能通过减少拼写和其他常见错误,使您可以快速插入和编辑代码。 您也可以使用此功能查看: 标签的可用属性, 函数的可用参数,或 对象的可用方法。 受支持的语言和技术 Dreamweaver 支持下列语言和技术的代码提示: HTML CSS JavaScript  PHP 阅

  • 主要内容:Eclipse 代码重构Eclipse 代码重构 重命名在整个项目中广泛使用的类可能需要很多时间,但 Eclipse 重构向导通过自动检测对被重命名的类的所有依赖项并对其进行修改,使工作变得更容易。 重构菜单可以通过以下方式打开 : 在 Package Explorer 视图中右键单击 Java 元素并选择 Refactor 菜单项。 在 Java 编辑器中右键单击 Java 元素并选择 Refactor 菜单项。 在包

  • 主要内容:Intellij Idea 重命名,Intellij Idea 复制重构,Intellij Idea 移动重构,Intellij Idea 安全删除,Intellij Idea 查找和替换重复代码重构是改变现有程序结构而不改变其功能和用途的过程。重构还用于提高代码的可重用性、提高性能并删除重复的功能或未使用的功能。重构是一项应该非常小心地执行的任务,因为一个错误可能会产生很多错误。 在重构菜单中,我们可以找到所有可能的重构选项。还有一个可用于重构的快捷方式选项。“Ctrl+Alt+Sh

  • 我正在尝试使用代码构建操作在AWS代码管道上部署AWS CDK应用程序。 构建和部署在本地完美工作(因为它会!)但是在CodeBuild上运行时,命令失败 这很可能是一些琐碎的事情,但我却在挠头,想弄明白是什么! 项目结构是自动生成的(使用) 对于阶段是 是(此阶段的输入目录是阶段的工件,即目录) 阶段抛出cdk ls步骤中的错误。由于上面的构建/部署步骤在本地工作(在干净的签出中),我怀疑这可能