0

ほとんどが Java であり、どちらも初めての Apache Crunch の例を読んでいます。(私は.NETを知っています)サンプルコードは次のとおりです。

DoFn<String, Pair<String, Long>> extractIPResponseSize = new DoFn<String, Pair<String, Long>>() {
  transient Pattern pattern;
  public void initialize() {
    pattern = Pattern.compile(logRegex);
  }
  public void process(String line, Emitter<Pair<String, Long>> emitter) {
    Matcher matcher = pattern.matcher(line);
    if(matcher.matches()) {
      try {
        Long responseSize = Long.parseLong(matcher.group(7));
        String remoteAddr = matcher.group(1);
        emitter.emit(Pair.of(remoteAddr, responseSize));
      } catch (NumberFormatException e) {
        // corrupt line, we should increment a counter
      }
    }
  }
};

最初の行は私を非常に混乱させ、私はそれを理解することができません.一つ一つ説明してもらえますか? 注:DoFnは Apache Crunch のクラスであり、そのドキュメントは次のとおりです: http://crunch.apache.org/apidocs/0.3.0/org/apache/crunch/DoFn.html

私もいくつかのグーグルを行いPairましたが、ここでもApacheの共通言語のように見えます: http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/tuple/ Pair.html

たぶん、私が理解する必要があるのはJavaジェネリックですか?

4

1 に答える 1

1

DoFnジェネリッククラスです。つまり、その各インスタンスには型引数が含まれます。型引数はメソッド内で使用されますが、コンパイラによってObject参照に置き換えられます。ジェネリックの詳細については、Wikibooksを参照してください。

その行の後の左中括弧については、これが実際に宣言されている内部クラスであることを微妙に思い出させるものです。およびメソッドDoFnをオーバーライドするのは、 の無名サブクラスです。内部クラスの詳細については、Wikibooksを再度参照してください。initializeprocess

于 2013-07-22T19:55:09.130 に答える