2016-07-15 2 views
3

ラムダとJava8の新機能です。私は次のエラーに直面しています。つまり、(あなたの変数ログが最終でなければなりません:囲みスコープで定義されて囲みスコープで定義されたローカル変数ログは、最終的に、または効果的に最終的なものでなければなりません。

ローカル変数ログが

public JavaRDD<String> modify(JavaRDD<String> filteredRdd) { 

    filteredRdd.map(log -> { 

     placeHolder.forEach(text -> { 

      //error comes here 
      log = log.replace(text, ","); 

     }); 

     return log; 

    }); 

    return null; 
} 

答えて

5

効果的に、最終的な最終または でなければならないメッセージは、問題がある、まさに言う運びますキーワードfinal)または実質的に最終的なもの(つまり、に1回だけのラムダ外に値を割り当てます)。

それ以外の場合は、その変数をラムダステートメントで使用することはできません。 もちろん、これはログの使用と競合します。ポイントは、あなたはラムダ内の何かに外部から書き込むことはできません。あなたがやろうとするもののために他の方法を探す必要があります。

その意味では、ちょうどコンパイラを信じています。サイドノード:ここにエラーメッセージを投稿するのではなく、あなたは最初にGoogleにそれを試みることができます(それは "先行研究"と呼ばれ、実際にあなたがやるべきことです)。

+0

応答 – BDR

8

この制限の理由は、ローカル変数(匿名)内部クラス内からのアクセスは、(有効)最終なければならないことJava言語機能の理由と同じです。

This answer rgettmanがその詳細に入ります。 rgettmanは制限事項を明確に説明しており、ラムダ式の動作は匿名の内部クラスと同じにする必要があるため、その答えにリンクします。ただし、このような制限はクラス変数またはインスタンス変数には存在しません。これの主な理由はやや複雑で、Roedy Greenが行っていることよりもそれをよく説明できませんでしたhere

ルールは匿名の内部クラスは、囲むメソッドの最終的なローカル変数 にしかアクセスできません。どうして?内部クラスの メソッドが後で呼び出される可能性があるので、それを生成したメソッドが終了してからずっと後で、 は終了しました。 AWT(Advanced Windowing Toolkit)イベントによって呼び出されます。 ローカル変数は長くなくなっています。匿名クラスは、 で動作しなければならず、匿名の内部クラスオブジェクトのコンパイラによって秘密裏に秘密裏に必要とされるものだけがフラッシュされます。 ローカル変数はなぜ最終的なものでなければならないのですか?コンパイラではありません 最終的なローカル変数のコピーを取るだけですが、それは多くの方法で は最終的なパラメータではありませんか?そうした場合は、変数のコピーが2つあります( )。それぞれは独立して変更できます。 呼び出し元と呼び出し先のパラメータのコピーのように同じですが、どちらのコピーにもアクセスするには同じ構文を使用します( )。これは混乱するでしょう。だから太陽 はローカル決勝を主張した。これは実際には という2つのコピーがあることとは無関係です。

呼び出し元の最終ローカルの 変数にアクセスする匿名クラスの機能は、実際にはいくつかのローカル変数を余分なコンストラクタパラメータとして自動的に渡すための文法的な砂糖です。全部 は、私にオードー・クルージュの匂いがします。

+1

をありがとう私は2つの(あなたがラムダ式のスコープに慣れている少なくともまで)の間の相互作用を理解するためにラムダ式に匿名クラスのスニペットを変換するために、IDEの機能を使用することをお勧め。 –

+0

意味があります。ありがとう – BDR

0

内部クラスは、その周囲のメソッドから任意の値を変更できないことを覚えておいてください。 forecachの2番目のラムダ式は、その周囲のメソッド変数(log)にアクセスしようとしています。

これを解決するには、それぞれにラムダを使用するのを避けることができます。したがって、それぞれを簡単にして、ログのすべての値を再パースします。

 filteredRdd.map(log -> { 
     for (String text:placeHolder){ 
      log = log.replace(text,","); 
     } 
     return log; 
    }); 
関連する問題