'"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 1:[1]

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.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dawood ibn Kareem