Ich möchte eine java.util.streams.Stream
um eine InputStream
wickeln, um ein Byte oder ein Zeichen zu einem Zeitpunkt zu verarbeiten. Ich habe keinen einfachen Weg gefunden, dies zu tun.Wie kann ich Java 8 Streams mit einem InputStream verwenden?
Betrachten Sie die folgende Übung: Wir möchten zählen, wie oft jeder Buchstabe in einer Textdatei angezeigt wird. Wir können dies in einem Array speichern, so dass tally[0]
speichert, wie oft a in der Datei erscheint, tally[1]
speichert die Anzahl der Zeit, die b erscheint, und so weiter. Da ich keine Möglichkeit, Streaming die Datei direkt finden konnte, habe ich dies:
int[] tally = new int[26];
Stream<String> lines = Files.lines(Path.get(aFile)).map(s -> s.toLowerCase());
Consumer<String> charCount = new Consumer<String>() {
public void accept(String t) {
for(int i=0; i<t.length(); i++)
if(Character.isLetter(t.charAt(i))
tall[t.charAt(i) - 'a' ]++;
}
};
lines.forEach(charCount);
Gibt es eine Möglichkeit, dies zu erreichen, ohne die lines
Methode? Kann ich jedes Zeichen direkt als Stream oder Stream verarbeiten, anstatt Strings für jede Zeile in der Textdatei zu erstellen.
Kann ich java.io.InputStream
in java.util.Stream.stream
direkter umwandeln?
Vorsicht! "Character.isLetter" gibt für mehr als nur "a-z", z. 'ä' oder' π'. – Holger
Richtig, ich dachte zuerst Umwandlung in Kleinbuchstaben würde dafür sorgen. Vielleicht möchte ich .isLowerCase? – Thorn
Nein, der Punkt ist, dass Java Unicode verwendet und es gibt weit mehr als 26 Buchstaben. Die Umwandlung in Kleinbuchstaben wird das Richtige für sie tun, z.B. wandeln '' Ä'' in '' ä'' und '' '' in '' π'' um. Wenn Sie jedoch die 26 Werte zwischen "a" und "z" zählen möchten, sollten Sie die Suche nach diesem Bereich filtern (wie in meiner Antwort), anstatt "isLetter" zu verwenden. ''Ä'' und'' π'' * sind * Kleinbuchstaben ... – Holger