2016-10-20 16 views
1

私はファイルを読み込み、整数リストを作成しています。文字列のリスト内の非整数のフィルタリング

サンプルファイル:「ABC」の整数に変換することができないので、それが失敗した以下のコードを実行するには

1 1 2 3 4 
2 2 5 abc 

4 2 8 

非整数フィールドをJava 8 Egのよりクリーンな方法でフィルタリングすることが可能かどうか教えてください。

try (BufferedReader br = new BufferedReader(new InputStreamReader(
     new FileInputStream(file)))) { 

    List<Integer> allValues = new ArrayList<>();  
     br.lines().forEach(
      strLine -> { 
      List<String> wordsList = Arrays.asList(strLine.trim().split(" ")); 
      List<Integer> routes = wordsList.stream() 
       .filter(e -> e != null && !e.isEmpty()) 
       .map(Integer::valueOf) 
       .collect(Collectors.toList()); 
      allValues.addAll(routes); 
      }); 

     allValues.forEach(str -> System.out.print(str)); 
    } 

答えて

3
  • あなたは、行のストリームを取得するためにFileInputStream>InputStreamReader>BufferedReader迂回する必要はありません。 BufferedReaderが必要な場合でも、Files.newBufferedReader

  • forEachの既存のコレクションを操作しないでください。もしあなたがそれに落ちるなら、あなたは普通のループにとどまるほうがよい。 Streamの場合、ネストされたアイテムを処理するにはflatMapがあります。ライン内のトークン自体は[0-9]+も空の文字列をソートし、少なくとも一桁、存在しなければならないことを意味し、単純な正規表現を用いて濾過するが、分割パターンではなく" "として" *"を用いて、空にすることができる

  • トークン文字列は最初の場所にも作成されません。 null分割操作

の結果として発生することはありません...

List<Integer> allValues; 
try(Stream<String> lines=Files.lines(file.toPath())) { 
    allValues=lines.flatMap(Pattern.compile(" *")::splitAsStream) 
     .filter(s -> s.matches("[0-9]+")) 
     .map(Integer::valueOf) 
     .collect(Collectors.toList()); 
} 
関連する問題