Search code examples
javasonarqubespring-data-mongodbsonarlint

"Make this anonymous inner class a lambda" code smell in SonarLint


While checking up the SonarLint report, I am getting this code smell "Make this anonymous inner class a lambda" a number of times. How can I make this inner class as lambda? It is bit challenging for me. How do I resolve this, these are my affected codes.

Aggregation agg = Aggregation.newAggregation(

        new AggregationOperation() {

            @Override
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(resourceDetails, new Document(arrayElemAt,
                        Arrays.asList(new Document(objToArray, rootResourseDetails), 1L))));
            }

        }, new AggregationOperation() {

            @Override
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(resourceDetails, resourceDeatilsV));
            }

        }, LookupOperation.newLookup().from(resourceDetailsStr).localField(resourceDetails).foreignField("_id")
                .as(resourceDetails),
        new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(resourceDetails,
                        new Document(arrayElemAt, Arrays.asList(resourcedetailsTempString, 0L))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(domainStr, new Document(arrayElemAt,
                        Arrays.asList(new Document(objToArray, resourceDetailsDomain), 1L))));
            }
        }

        , new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(domainStr, domainV));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(lookup, new Document("from", "infra_asset")
                        .append("let", new Document(assetIdStr, assetRefId).append(domainStr, rootDomain))
                        .append(pipeLineStr,
                                Arrays.asList(new Document(match, new Document(expr, new Document("$and",
                                        Arrays.asList(new Document("$eq", Arrays.asList(domain, infra)),
                                                new Document("$eq", Arrays.asList("$_id", assetId))))))))
                        .append("as", "infraAssest"));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(lookup, new Document("from", "application_asset")
                        .append("let", new Document(assetIdStr, assetRefId).append(domainStr, rootDomain))
                        .append(pipeLineStr,
                                Arrays.asList(new Document(match, new Document(expr, new Document("$and",
                                        Arrays.asList(new Document("$eq", Arrays.asList(domain, "Application")),
                                                new Document("$eq", Arrays.asList("$_id", assetId))))))))
                        .append("as", applicationAsset));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(project, new Document(resourceDetails, 1L).append(resourceThresholdStr, 1L)
                        .append(customFieldStr, new Document(cond, new Document("if",
                                new Document("$eq", Arrays.asList(rootDomain, infra)))
                                .append("then", rootInfraAsset)
                                .append("else", new Document(cond,
                                        new Document("if",
                                                new Document("$eq", Arrays.asList(rootDomain, application)))
                                                .append("then", rootApplicationAsset)
                                                .append("else", "null"))))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(customFieldStr,
                        new Document(arrayElemAt, Arrays.asList(customField, 0L))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(match, new Document(expr, new Document("$and",
                        Arrays.asList(new Document("$eq", Arrays.asList(customFieldPlatformName, platformName)),
                                new Document("$eq", Arrays.asList(customFieldAssetName, assetName))))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(moduleStr, new Document(arrayElemAt,
                        Arrays.asList(new Document(objToArray, resourceDetailModule), 1L))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(moduleStr, moduleV));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(lookup, new Document("from", modulesStr).append(localFieldStr, moduleStr)
                        .append(foreignFieldStr, "_id").append("as", moduleStr));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields,
                        new Document(moduleStr, new Document(arrayElemAt, Arrays.asList(module, 0L))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(match,
                        new Document(expr, new Document("$eq", Arrays.asList(moduleString, moduleName))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {

                return new Document(addFields, new Document(resourceThresholdStr, new Document(arrayElemAt,
                        Arrays.asList(new Document(objToArray, "$$ROOT.resourceThreshold"), 1L))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(resourceThresholdStr, "$resourceThreshold.v"));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(lookup,
                        new Document("from", "resource_threshold").append(localFieldStr, resourceThresholdStr)
                                .append(foreignFieldStr, "_id").append("as", resourceThresholdStr));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(resourceThresholdStr,
                        new Document(arrayElemAt, Arrays.asList("$resourceThreshold", 0L))));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(addFields, new Document(platformNameStr, customFieldPlatformName)
                        .append("asset_name", customFieldAssetName).append(moduleNameStr, moduleString));
            }
        }, new AggregationOperation() {
            public Document toDocument(AggregationOperationContext context) {
                return new Document(project, new Document(moduleNameStr, 1L).append(resourceThresholdStr, 1L)
                        .append(platformNameStr, 1L).append("asset_name", 1L));
            }
        }

);
 

Every block starting from new AggregationOperation is affected.


Solution

  • Instead of writing

    new AggregationOperation() {
    
        @Override
        public Document toDocument(AggregationOperationContext context) {
            return new Document(addFields, new Document(resourceDetails, new Document(arrayElemAt,
            Arrays.asList(new Document(objToArray, rootResourseDetails), 1L))));
        }
    }
    

    You should just be able to write

    context -> new Document(addFields, new Document(resourceDetails, new Document(arrayElemAt,
            Arrays.asList(new Document(objToArray, rootResourseDetails), 1L))))
    

    and similarly for every AggregationOperation that you create.

    This is because the compiler can figure out that you need an AggregationOperation and understands that an AggregationOperation has only one method. That's why you can replace the anonymous AggregationOperation with the lambda equivalent of that method.

    You might like to look into whether your IDE can do this refactoring for you automatically.