2016-10-20 2 views
1

Ich lese eine Datei und erstelle eine Integer-Liste.Filtern einer nicht ganzzahligen Zahl in einer Liste von Strings

Beispieldatei:

1 1 2 3 4 
2 2 5 abc 

4 2 8 

auf den folgenden Code ausgeführt fehlschlägt, weil der „abc“ kann nicht in eine ganze Zahl umgewandelt werden.

Könnten Sie mir bitte mitteilen, ob es möglich ist, die nicht ganzzahligen Felder in Java 8 sauberer herauszufiltern? ZB: Filter verwenden?

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)); 
    } 

Antwort

3
  • Sie brauchen nicht den FileInputStream>InputStreamReader>BufferedReader Umweg einen Strom von Linien zu erhalten. Auch wenn Sie eine BufferedReader benötigen, gibt es Files.newBufferedReader

  • Manipulieren Sie keine vorhandene Sammlung innerhalb forEach; Wenn Sie darauf zurückgreifen, bleiben Sie besser bei der normalen Schleife. Für Streams gibt es flatMap, um verschachtelte Elemente zu verarbeiten, z. innerhalb eines Tokens Linie

  • Die Token selbst mit einem einfachen regulären Ausdruck gefiltert werden kann, impliziert [0-9]+, dass es mindestens eine Ziffer, die auch leere Strings sein müssen, aber unter Verwendung von " *" als Split-Muster sortiert, anstatt " ", leer Strings sind nicht einmal an erster Stelle erstellt. null nie als Folge der Spaltung des Betriebs auftreten

...

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()); 
} 
Verwandte Themen