local :: reference传递给本地

时间:2015-05-11 17:39:20

标签: java java-8

我有一个类似于以下内容的构造函数:

public SqlReader(Schema schema) {
  super(schema::readRow,schema::initialize);
}

代码的主要部分可能如下所示:

Schema schema = new schema(schemaDefinition);
SqlReader sqlSource = new SqlReader(schema);
schema.groupBy(sqlSource,Column.column("market"),Column.sum("sales"));
result = schema.execute();

这是一段虚构的代码,允许我解释我们在这里处理延迟执行,其中schema.groupBy将修改架构,SqlReader取决于原始架构。

这里的问题是使用schema::readRow,您将schema的实际引用传递给成员引用,而不是它的副本,因为这会转换为您传递的匿名内部类schema

如何才能有效改善?

第一次尝试可能如下所示:

public SqlReader(Schema schema) {
  super(schema.clone()::readRow,schema.clone()::initialize);
}

开销是显而易见的:现在我创建了两次克隆。所以我可能会提出这个解决方案,而不是在API(SqlReader)中,我在自定义编码部分进行:

SqlReader sqlSource = new SqlReader(schema.clone());

这里的问题是,现在我要求API的用户知道这个问题,这个问题可能过于复杂,无法让用户理解或记住。

所以我提出了一种新方法:使用工厂,构建器或静态创建器:

public static create(Schema schema) {
  Schema schemaCopy = schema.clone();
  return new SqlReader(schemaCopy::readRow,schemaCopy::initialize);
}

对于并行化流,Lambda和方法引用来说,这似乎是一个常见问题,必须有一种更优雅的方法来解决这个问题吗?

0 个答案:

没有答案