2016-10-28 3 views
0

現在Javaを学んでいて、私が主な問題(マイナーな問題)と混同しています。ストリームを使用してテキストファイルを読み込む - lamba式の変数

私はテキストファイルを読み込み、各行の文字列を扱い、変数を追加して処理を続けます。 例:私は3行のテキストファイルを持っていて、各行の終わりに変数を追加して、各行に1つずつアップさせたいと思います。

私はすべてのプログラムを作りましたが、私はまだ十分に後ろを取ることはできません。

私のテキストファイル "test.txt"には、 "Line1"、 "Line2"、 "Line3"という3行のテキストがあり、各行の後に値500のtestNumという名前の整数があります。

私のコードは次のとおりです:

String fileName = "test.txt"; 
int testNum = 1024; 

Stream<String> readFileStream = null; 
try { 
    readFileStream = Files.lines(Paths.get(fileName)); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 
readFileStream.forEach(line -> {    
    System.out.println(line+testNum); 
    testNum++; 
}); 

今、私は問題はラムダ式であることを理解しています。誰かがラムダ式のローカル変数を必要とし、外部から宣言された変数にアクセスできない理由を私に説明することはできますか?

また、私はそれぞれの代わりに使用する私のコードを変更しようとしましたが、それぞれの「ストリーム」、例えば:

for(String line : readFileStream){ 
} 

事前のおかげでたくさんのために適用されないようです。

+0

特定の文字列のコンシューマを作成することができます。.. http://www.lambdafaq.org/what-are-the-reasons-for-the-restriction-to-effective-immutability/ – Jobin

答えて

1

一般に、ラムダ式の作成の時間と場所は、実行の時間と場所とは異なります。ラムダ式がメソッドAで作成され、メソッドBで30分または数時間後に実行されることがあります。そして、それは別のスレッドで実行されるかもしれません。したがって、メソッドスコープを持つ変数(メソッドが実行されている間だけ存在するスタック変数)に書き込むことは賢明ではありません。これらの変数への読み取りアクセスは、作成時にその値がラムダ式に 'コピー'されるので許可されます。あなたのケースでは

、ストリームを放棄し、あなたのために、ループを介して反復することができますので、Files.lines(...)Listバージョンを使用する方が簡単かもしれません:

List<String> lines = Files.readAllLines(Paths.get(filename)); 
int testNum = 500; 
for(String line : lines) { 
    System.out.println(line + testNum); 
    testNum++; 
} 
0

このタスクあなたのためのストリームを使用する場合それがここで説明されてhttps://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html

String fileName = "test.txt"; 

Stream<String> readFileStream = null; 
try { 
    readFileStream = Files.lines(Paths.get(fileName)); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

readFileStream.forEach(
    new Consumer<String>() { 
     int testNum = 1024; 
     public void accept(String line) { 
      try { 
       System.out.println(line + testNum++); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
}); 
関連する問題