Java バインディング
データ プロセッシング ライブラリは、 Java で完全に記述されたコンパイラーをサポートする Java インターフェイスを提供します。 このインターフェイスは、 Scala で利用できるほとんどの機能を一部の例外なく公開します。
Java 固有のクラスは com.here.platform.data.processing.java
、パッケージおよびそのサブパッケージで定義されます。
データ プロセッシング ライブラリ Java のクラスおよびメソッドの名前は、対応する Scala のクラスおよびメソッドと同じです。 ただし、 Scala 固有の型が Java ネイティブの型に置き換えられるため、メソッドの署名が異なる場合があります。 ここでは、これらの相違点について詳細に説明します。
「別名」と入力します
Java では、タイプのエイリアスは使用されません。 たとえば、 Scala API では、入力キーおよび出力キーがそれぞれ必要な場合に、タイプPartition.Key
のInKey
およびOutKey
エイリアスが使用されます。 ただし、 Java API では代わりに単一のタイプが使用 Key
されます。
Scala でエイリアスを入力 :
def compileInFn(in: (InKey, InMeta)): Iterable[(OutKey, IntermediateData)] = {
Java の同等のコード :
public Iterable<Pair<Key, IntermediateData>> compileInFn(Pair<Key, Meta> in) {
Symbol
クラス
多く Symbol
の Scala クラスでは、このクラスは ID または名前を表すメソッドに使用されます。 ただし、 Java の対応するクラスは String
代わりに使用されます。
Symbol
Scala のクラス :
val outKey = inKey.copy(catalog = Default.OutCatalogId, layer = Layer.Id("output-layer"))
Java の同等のコード :
Key outKey = inKey.withCatalog(Default.OutCatalogId())
.withLayer("output-layer");
Scala コレクション
Scala コレクションは、対応する Java コレクションに置き換えられます。
Scala のコレクション :
def resolveFn(src: (InKey, InMeta)): Map[RefName, Set[InKey]] = {
Java の同等のコード :
public Map<String, Set<Key>> resolveFn(Pair<Key, Meta> src) {
タプルとオプション
2 つの要素のタプルが com.here.platform.data.processing.java.Pair
Java API のクラスに置き換えられます。 scala.Option
タイプがに置き換え java.util.Optional
られます。
Option
Scala と入力します。
def compileOutFn(outKey: OutKey, intermediate: Iterable[IntermediateData]): Option[Payload] = {
if (intermediate.isEmpty) {
None
} else {
Some(Payload(encodeData(intermediate)))
}
}
Java の同等のコード :
public Optional<Payload> compileOutFn(Key outKey, Iterable<IntermediateData> intermediate) {
if (intermediate.iterator().hasNext()) {
return Optional.of(new Payload(encodeData(intermediate)));
} else {
return Optional.empty();
}
}
Scala Mixins
com.here.platform.data.processing.compiler
パッケージ内の Mixins を結合して、コンパイラーを実装する必要があります。 Java API は、これらのミクスチャをインターフェイスとして表します。 Scala で混合する必要があるすべての特性は、 Java で実装するインターフェイスです。
Scala でのコンパイラーの混合 :
class MyCompiler
extends RefTreeCompiler[IntermediateData]
with CompileInFnWithRefs[IntermediateData]
with CompileOut1To1Fn[IntermediateData] {
Java の同等のコード :
class MyCompiler
implements RefTreeCompiler<IntermediateData>,
CompileInFnWithRefs<IntermediateData>,
CompileOut1To1Fn<IntermediateData> {
一部の Java クラスでは、複数の Scala 特性が混合された場合と同じ機能が提供されます。
たとえば PipelineRunner
、 Scala でを拡張する場合は、次のようにします。
object Main extends PipelineRunner with DriverSetupWithBuilder {
def configureCompiler(completeConfig: CompleteConfig,
context: DriverContext,
builder: DriverBuilder): builder.type = {
Java の同等のコード :
class Main extends PipelineRunner {
@Override
public DriverBuilder configureCompiler(
CompleteConfig completeConfig, DriverContext context, DriverBuilder builder) {
Java 固有のインターフェイスを持たない Scala クラス
一部の Scala クラスには Java の対応するクラスがなく、 Java から直接使用できます。 次のものがあります。
- Scala バージョン (
com.here.platform.pipeline.logging.scaladsl.ContextAwareLogger
)および Java バージョン (com.here.platform.pipeline.logging.javadsl.ContextAwareLogger
)が存在するContextAwareContextLogger
クラスを除く、com.here.platform.pipeline.logging
パッケージ内のクラス。 com.here.platform.data.processing.statistics.Statistic
-
com.here.platform.data.processing.driver.job.ToProcess
およびサブクラス
これらの Scala クラスの一部は、 Java では利用できない機能である一致式で使用されることを意図しています。
Scala でのパターンマッチング :
val processingType = driverContext.jobVersions.inCatalogs(id)
val version = processingType match {
case NoChanges(v) => v
case Changes(_, v) => v
case Reprocess(v) => v
}
isInstanceOf
は、 Java の一連の述部に置き換えられます。
ProcessingType processingType = driverContext.jobVersions().inCatalogs().get(id);
long version;
if (processingType instanceof NoChanges) {
version = ((NoChanges) processingType).version();
} else if (processingType instanceof Changes) {
version = ((Changes) processingType).version();
} else if (processingType instanceof Reprocess) {
version = ((Reprocess) processingType).version();
} else {
throw new RuntimeException("Match error");
}
カリキュラム中です
一部のクラスでは、LogContext
クラスのメソッドwithChild
など、処理済みのメソッドを使用して機能を提供します。 Java バージョンでは、メソッドの呼び出しの本文部分は明示的なラムダ式です。
そのため、次の Scala コードが必要です。
val logger = new ContextAwareLogger(getClass)
LogContext.withChild("my-context-id", id) {
val payload = retriever.getPayload(in.key, in.meta)
logger.debug(s"Retrieved ${payload.length} bytes")
}
次のようになり
ContextAwareLogger logger = new ContextAwareLogger(getClass());
LogContext.withChild(
"my-context-id",
id,
() -> {
Payload payload = retriever.getPayload(in.getKey(), in.getValue());
logger.debug("Retrieved {} bytes", payload.length());
});
暗黙的な引数
暗黙的な引数は Java ではサポートされていません。そのため、引数リストに追加され、明示的に指定する必要があります。
これには ClassTag
、コンパイル時に利用可能なすべてのタイプの情報をランタイムに伝達するために一部のメソッドで使用される Scala が含まれます。
def buildTask(driverBuilder: DriverBuilder,
compiler: Direct1ToNCompiler[IntermediateData]): DriverTask = {
val taskBuilder = driverBuilder.newTaskBuilder("task1")
taskBuilder.withDirect1ToNCompiler(compiler).build()
}
Java では、クラスオブジェクトを明示的に次の場所に渡す必要があり withDirect1ToNCompiler
ます。
DriverTask buildTask(
DriverBuilder driverBuilder, Direct1ToNCompiler<IntermediateData> compiler) {
TaskBuilder taskBuilder = driverBuilder.newTaskBuilder("task1");
return taskBuilder.withDirect1ToNCompiler(compiler, IntermediateData.class).build();
}
Java で現在サポートされている機能の一覧については 、『 API リファレンス』を参照してください。