Java バインディング

データ プロセッシング ライブラリは、 Java で完全に記述されたコンパイラーをサポートする Java インターフェイスを提供します。 このインターフェイスは、 Scala で利用できるほとんどの機能を一部の例外なく公開します。

Java 固有のクラスは com.here.platform.data.processing.java 、パッケージおよびそのサブパッケージで定義されます。

データ プロセッシング ライブラリ Java のクラスおよびメソッドの名前は、対応する Scala のクラスおよびメソッドと同じです。 ただし、 Scala 固有の型が Java ネイティブの型に置き換えられるため、メソッドの署名が異なる場合があります。 ここでは、これらの相違点について詳細に説明します。

「別名」と入力します

Java では、タイプのエイリアスは使用されません。 たとえば、 Scala API では、入力キーおよび出力キーがそれぞれ必要な場合に、タイプPartition.KeyInKeyおよびOutKeyエイリアスが使用されます。 ただし、 Java API では代わりに単一のタイプが使用 Keyされます。

Scala でエイリアスを入力 :

def compileInFn(in: (InKey, InMeta)): Iterable[(OutKey, IntermediateData)] = {

  // InKey and OutKey are aliases of Key
  // InMeta is alias of Meta
  // ...

Java の同等のコード :

public Iterable<Pair<Key, IntermediateData>> compileInFn(Pair<Key, Meta> in) {
  // ...

Symbol クラス

多く Symbol の Scala クラスでは、このクラスは ID または名前を表すメソッドに使用されます。 ただし、 Java の対応するクラスは String 代わりに使用されます。

Symbol Scala のクラス :

// Catalog.Id and Layer.Id are aliases of Symbol
val outKey = inKey.copy(catalog = Default.OutCatalogId, layer = Layer.Id("output-layer"))

Java の同等のコード :

// Default.OutCatalogId() and the layer ID are String objects
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 {

  // configureCompiler provided by DriverSetupWithBuilder
  def configureCompiler(completeConfig: CompleteConfig,
                        context: DriverContext,
                        builder: DriverBuilder): builder.type = {
    // ...

Java の同等のコード :

class Main extends PipelineRunner {

  // configureCompiler directly provided by 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) // or use the one provided by ContextLogging
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 リファレンス』を参照してください。

」に一致する結果は 件です

    」に一致する結果はありません