我想TreeMaker在我的 netbeans 代码生成器插件中使用类型参数生成构造函数调用。此外,我想导入类型而不是使用完全限定的名称(请参阅 参考资料QualIdent)。
我正在为此目的使用该NewClass方法。
给定输入java.util.ArrayList和java.lang.Integer生成的代码应该类似于:
import java.util.ArrayList;
...
new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
如果输入是java.util.ArrayList,java.util.List<java.lang.Integer>并且生成的代码应该类似于:
import java.util.ArrayList;
import java.util.List;
...
new ArrayList<List<Integer>>();
Run Code Online (Sandbox Code Playgroud)
(类型参数列表存储为List<? extends TypeMirror>)
如何生成所需的输出?
(maker是TreeMaker实例)
将类型名称转换为字符串:
String className = "java.util.ArrayList<java.util.List<java.lang.Integer>>"; // actually computed in real code
maker.NewClass(null,
Collections.<ExpressionTree>emptyList(),
maker.QualIdent(className),
Collections.<ExpressionTree>emptyList(),
null);
Run Code Online (Sandbox Code Playgroud)
这会产生语法/语义正确的 java 代码,但使用完全限定的类名,即 new java.util.ArrayList<java.util.List<java.lang.Integer>>()
通过typeArguments至NewClass:
List<ExpressionTree> typeArguments = Collections.singletonList(maker.QualIdent("java.lang.Integer")); // actually computed …Run Code Online (Sandbox Code Playgroud)请看下面的代码:
//Create Spark Context
SparkConf sparkConf = new SparkConf().setAppName("TestWithObjects").setMaster("local");
JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf);
//Creating RDD
JavaRDD<Person> personsRDD = javaSparkContext.parallelize(persons);
//Creating SQL context
SQLContext sQLContext = new SQLContext(javaSparkContext);
DataFrame personDataFrame = sQLContext.createDataFrame(personsRDD, Person.class);
personDataFrame.show();
personDataFrame.printSchema();
personDataFrame.select("name").show();
personDataFrame.registerTempTable("peoples");
DataFrame result = sQLContext.sql("SELECT * FROM peoples WHERE name='test'");
result.show();
Run Code Online (Sandbox Code Playgroud)
在此之后,我需要将DataFrame - 'result'转换为Person Object或List.提前致谢.