'TypeSpec.anonymousClassBuilder("")' is used to define anonymous inner class.
TypeSpec comparatorType = TypeSpec.anonymousClassBuilder("")
.addSuperinterface(ParameterizedTypeName.get(Comparator.class, String.class))
.addMethod(MethodSpec.methodBuilder("compare").addAnnotation(Override.class).addModifiers(Modifier.PUBLIC)
.addParameter(String.class, "a").addParameter(String.class, "b").returns(int.class)
.addStatement("return $N.length() - $N.length()", "a", "b").build())
.build();
MethodSpec sortByLengthMethodSpec = MethodSpec.methodBuilder("sortByLength").addModifiers(Modifier.STATIC)
.addParameter(ParameterizedTypeName.get(List.class, String.class), "inputList")
.addStatement("$T.sort($N, $L)", Collections.class, "inputList", comparatorType).build();
Above snippet generates following method definition.
static void sortByLength(List<String> inputList) {
Collections.sort(inputList, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.length() - b.length();
}
});
}
Find the below working application.
AnonymousClassDemo.java
package com.sample.app;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.lang.model.element.Modifier;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeSpec;
public class AnonymousClassDemo {
public static void main(String args[]) throws IOException {
TypeSpec comparatorType = TypeSpec.anonymousClassBuilder("")
.addSuperinterface(ParameterizedTypeName.get(Comparator.class, String.class))
.addMethod(MethodSpec.methodBuilder("compare").addAnnotation(Override.class)
.addModifiers(Modifier.PUBLIC).addParameter(String.class, "a").addParameter(String.class, "b")
.returns(int.class).addStatement("return $N.length() - $N.length()", "a", "b").build())
.build();
MethodSpec sortByLengthMethodSpec = MethodSpec.methodBuilder("sortByLength").addModifiers(Modifier.STATIC)
.addParameter(ParameterizedTypeName.get(List.class, String.class), "inputList")
.addStatement("$T.sort($N, $L)", Collections.class, "inputList", comparatorType).build();
MethodSpec mainMethodSpec = MethodSpec.methodBuilder("main").addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(void.class).addParameter(String[].class, "args")
.addStatement("sortByLength(asList(\"a\", \"abcd\", \"ab\"))").build();
TypeSpec helloWorldTypeSpec = TypeSpec.classBuilder("Test").addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addMethod(mainMethodSpec).addMethod(sortByLengthMethodSpec).build();
String packageName = "com.sample.app";
JavaFile javaFile = JavaFile.builder(packageName, helloWorldTypeSpec).addStaticImport(Arrays.class, "asList")
.build();
javaFile.writeTo(System.out);
}
}
Generated Code
package com.sample.app;
import static java.util.Arrays.asList;
import java.lang.Override;
import java.lang.String;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public final class Test {
public static void main(String[] args) {
sortByLength(asList("a", "abcd", "ab"));
}
static void sortByLength(List<String> inputList) {
Collections.sort(inputList, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.length() - b.length();
}
});
}
}
No comments:
Post a Comment