Mit Java 8+ Streams Zeilen nummern zu Zeilen hinzufügen

Zongatel

Mitglied
Hallo allesamt,
irgendwie ist es ein fürchterlich banales Streben. Imperativ hätte ich überhaupt keine Probleme damit:
Gegeben wäre z.B. ein Array aus Strings denen ich gerne jeweils vorne eine iterierte Nummer geben möchte um sie z.B. hinterherausgeben oder sowas

Also die Tutorials sind ja ganz nett, man kann sich Zahlen in einem endlos-Stream geben lassen man kann sogar Zeilen eines Files lesen, wow.
Aber wie mache ich das mit Zahlen die ich mir generieren lasse um die Strings oder Zeilen zu nummerieren?
Ich dachte an sowas wie Intstream.generate und map etc, aber wie kombiniere ich dass denn dann mittels Stream?
Hat jemand da eine Idee oder Beispiel?
Wie gesagt hinerher soll sowas wie
1. meine erste Zeile
2. meine zweite Zeile
3. ....
rauskommen

PS: ich googelte auch schon nach dem Stichwort Java8 Streams merge aber die Autoren diesen Themas verstehen unter merge lediglich ein aneinanderhängen von Streams, sowas verstehe ich tatsächlich nicht unter merge, sondern sowas wie:
Stream1 : 1,2,3,4,5,6,7
Stream2: a,b,c,d,e,f,g
Merge 1a,2b,3c ...
 
Zuletzt bearbeitet:

hulda-90

Aktives Mitglied
Das ist etwas kompliziert, weil Streams in Java dafür nicht vorgesehen sind, wie du auch schon richtig angemerkt hast.

 

mihe7

Top Contributor
Gegeben wäre z.B. ein Array aus Strings denen ich gerne jeweils vorne eine iterierte Nummer geben möchte um sie z.B. hinterherausgeben oder sowas
Java:
static class SequenceMapper<T> {
    AtomicInteger current;
    BiFunction<T, Integer, T> mapper;

    public SequenceMapper(int start, BiFunction<T, Integer, T> mapper) {
        current = new AtomicInteger(start);
        this.mapper = mapper;
    }

    public T map(T value) {
        return mapper.apply(value, current.getAndIncrement());
    }
}

Java:
SequenceMapper<String> mapper = new SequenceMapper<>(1000, (s,v) -> String.format("%d: %s", v, s));
Stream.of("A","B","C","D","E","F").map(mapper::map).forEach(System.out::println);
 

mihe7

Top Contributor
Kaum abgeschickt, fällt mir auf, dann man statt des Integers einfach einen Supplier hätte verwenden können...

Java:
static class SequenceMapper<T,V> {
    Supplier<V> supplier;
    BiFunction<T, V, T> mapper;

    public SequenceMapper(Supplier<V> supplier, BiFunction<T, V, T> mapper) {
        this.supplier = supplier;
        this.mapper = mapper;
    }

    public T map(T value) {
        return mapper.apply(value, supplier.get());
    }
}
 

Neumi5694

Top Contributor
Es gibt da einige Möglichkeiten (der Supplier gefällt mir z.B. sehr gut). Es läuft - egal wie du's machst - darauf raus, dass dein Indexwert nicht einfach in einer Variable stehen kann, sondern durch eine Methode oder was auch immer an die Lambdafunktion übergeben wird.
 

hulda-90

Aktives Mitglied
Das Stichwort wäre zip, statt merge. Gibt es aber ohne Libs in Java so nicht direkt
Zip ist semantisch nicht exakt äquivalent zu interleave; zip "verschmelzt" Elemente

Wie es auch sei, Streams sind in Java nicht dafür vorgesehen; der Workaround mit AtomicInteger funktioniert zwar, ist aber ein Antipattern

Oder anders: Das mit Streams ist unsinnig, lass es, oder verwende einen imperativen Ansatz.
 

Zongatel

Mitglied
Danke für diese interessante Lösung.
Ich selbst hatte dann auch mal über eine Lösung nachgedacht, von der ich allerdings nicht weiß, ob sie so im Sinne der "Funktionalen Programmierung ist.


[CODE lang="java" title="Mit einer simplen Counter-Klasse"]




static private void lineNumberTest(String ... lines)
{
Counter lineNumber = new Counter();

Stream<String> lineStream = Stream.of(lines);

lineStream.map(line -> ""+lineNumber.getNextNum() + ':' +line)
.forEach(System.out::println);
}
public static void main(String[] args)
{
randomTest();
biFunctionTest();
System.out.println("-----------");
lineNumberTest("Balala ","blubsbla","flucka flüh","simsalabim");
}

static private class Counter
{
int i = 1;

public int getNextNum()
{
return i++;
}
}

[/CODE]

Wäre das so aus Eurer Sicht eine gute Art, oder gibt es bei dieser Lösung einen Drawback/Pferdefuß?
 

Zongatel

Mitglied
Zip ist semantisch nicht exakt äquivalent zu interleave; zip "verschmelzt" Elemente

Wie es auch sei, Streams sind in Java nicht dafür vorgesehen; der Workaround mit AtomicInteger funktioniert zwar, ist aber ein Antipattern

Oder anders: Das mit Streams ist unsinnig, lass es, oder verwende einen imperativen Ansatz.
Um die Philosophie besser zu verstehen, was wäre beim AtomicInteger der Pferdefuß?
 

LimDul

Top Contributor
Grundsätzlich kann man das machen - sinnvoll ist es, wie schon geschrieben, nicht wirklich.

Man verteilt die Logik auf mehrere Funktionen (sogar Klassen!), sie ist gegenüber der direkten, imperativen Lösung schwerer lesbar/schwerer verständlich. Deine ist z.B. nicht Thread-Safe, je nach Nutzung.

Es ist schlicht erhöhte Komplexität ohne Nutzen. Eine Aufteilung in mehrere Funktionen / Klassen macht man ja im Sinne eines Seperation of Concerns, weil die unterschiedliche Dinge machen. Hier macht man die Aufteilung aufgrund einer Restriktion der Stream-Logik und nicht weil das hochzählen einer Variable etwas ist, was man auslagern sollte.
 

Zongatel

Mitglied
Grundsätzlich kann man das machen - sinnvoll ist es, wie schon geschrieben, nicht wirklich.

Man verteilt die Logik auf mehrere Funktionen (sogar Klassen!), sie ist gegenüber der direkten, imperativen Lösung schwerer lesbar/schwerer verständlich. Deine ist z.B. nicht Thread-Safe, je nach Nutzung.

Es ist schlicht erhöhte Komplexität ohne Nutzen. Eine Aufteilung in mehrere Funktionen / Klassen macht man ja im Sinne eines Seperation of Concerns, weil die unterschiedliche Dinge machen. Hier macht man die Aufteilung aufgrund einer Restriktion der Stream-Logik und nicht weil das hochzählen einer Variable etwas ist, was man auslagern sollte.
Ja ich finde auch, dass es nicht wirklich verständlicher wird, und viel weniger Zeilen Code als eine imperative Lösung ist es dann auch nicht zumindest in diesem Beispiel. Aber warum muss man da bei so naheliegenden Aufgaben mit Streams solche Verränkungen machen oder gibt es am Ende doch eine bessere Möglichkeit mit Streams, die mir nur auf Grund mangelnder Erfahrung nicht einfällt?
 

LimDul

Top Contributor
Streams sind für solche Dinge schlicht nicht gemacht.

Streams sind Datenflüsse, dass heißt ich schaue mir jedes "Paket" was vorbeikommt an und entscheide lokal was ich damit mache. Einen Zustand während der Verarbeitung gibt es in der Form nicht und passt schlicht auch nichts in Konzept. Im Best-Case kann ein .stream() auch durch .parallelStream() ersetzen ohne Nachteile. Eine Zeilen-Nummerierung kommt aber eben nicht ohne Zustand (letzte vergebene Zeilennummer) aus und deswegen muss man diese Verrenkungen machen.

Eine Schraube reindrehen ist auch etwas total simples, trotzdem nimmt niemand einen Hammer dafür :)
 

LimDul

Top Contributor
Aber damit wäre ohne diese einen oder anderern Verrenkungen ein Stream ja eigentlich nicht turingvollständig, oder?
Die Aussage verstehe ich in der Form nicht. Du müsstest jetzt erstmal definieren, was ein Stream ist. Und Verrenkungen sind bei einer Turing-Vollständigkeit normal - versuch mal dein Problem auf einer 1-Band Turing Maschine mit 0en und 1en als einzige Zeichen zu lösen - da musst du dich ziemlich verrenken.
 
G

Gelöschtes Mitglied 65838

Gast
versuch mal dein Problem auf einer 1-Band Turing Maschine mit 0en und 1en als einzige Zeichen zu lösen - da musst du dich ziemlich verrenken.
du musst deine turing maschine nicht so definieren... du kannst auch einfach sagen ich darf 7er speichern auf einem band.. nur ich speicher da halt eine unter turing maschine... die maschine muss gewisse sachen erfüllen um turing komplett zu sein

was ein stream damit zu tun hat weis ich leider auch nicht da es da um die sprache geht die man benutzt
 

hulda-90

Aktives Mitglied
Vielleicht suchst du auch so etwas:

Java:
import java.util.Arrays;
import java.util.Iterator;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class TwoStreams {
    public static void print1(String[] lines) {
        for (int i = 0; i < lines.length; i++) {
            System.out.println(i + 1 + ": " + lines[i]);
        }
    }

    public static void print2(String[] lines) {
        Stream<String> stream = Arrays.stream(lines);
        Iterator<String> iterator = stream.iterator();
        IntStream.rangeClosed(1, lines.length).mapToObj(i -> i + ": " + iterator.next()).forEach(System.out::println);
    }

    public static void main(String[] args) {
        String[] lines = {
                "one", "two", "three", "four"
        };
        print1(lines);
        print2(lines);
    }
}

obwohl das genau genommen gemogelt ist, weil print2 ein String-Array hat und von Arrays die Länge bekannt ist...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Wie funktionieren parallele Java Streams? Allgemeine Java-Themen 1
R Collections BiPredicate in Java 8 Streams Allgemeine Java-Themen 7
Peterw73 Hilfe bei Java gesucht Allgemeine Java-Themen 2
A Java unter Win 10 Allgemeine Java-Themen 1
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
T Java Robot Class - Bot Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
D VBA Code mit Java ausführen möglich? Allgemeine Java-Themen 10
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
izoards Java Home Pfad unabhängig von der Version Allgemeine Java-Themen 7
N JAVA-Code mit Grafikfenster zeichnet in Windows, aber nicht Mac. Allgemeine Java-Themen 4
U Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
KonradN CVE-2022-21449: Fehler in Java bei Signaturprüfung Allgemeine Java-Themen 20
berserkerdq2 Java sql Allgemeine Java-Themen 15
JordenJost Unverständlicher Java code? Allgemeine Java-Themen 21
L XSD To Java - Überschreiben von Assoziationen Allgemeine Java-Themen 1
Aartiyadav Comparisons and Swapa in Bubble-sort Java Allgemeine Java-Themen 4
KonradN Java 18 Allgemeine Java-Themen 8
N Statistische Auswertung von Logfiles (Einlesen, auswerten und grafische Aufbereitung von logfiles) mit Java Allgemeine Java-Themen 9
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
V Hilfe mit Java Code Allgemeine Java-Themen 4
S Processing Java Code verstehen Allgemeine Java-Themen 4
O Newton Algorithmus Java Allgemeine Java-Themen 1
P Java Quellen finden Allgemeine Java-Themen 3
M Java Analyse/ SWOT-Analyse Allgemeine Java-Themen 13
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
E java mithilfe url .jar datei öffnen Allgemeine Java-Themen 5
M Warum hat Java dieses und jenes nicht... Allgemeine Java-Themen 8
E Java .exe Datei mit args starten Allgemeine Java-Themen 2
L Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
thor_norsk Handy - Ortung mit Java Allgemeine Java-Themen 23
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
Master3000 Java Datei mehrmals einlesen Allgemeine Java-Themen 4
Master3000 Java Konsole über Buffered Reader Zeilenweise auslesen ? Allgemeine Java-Themen 26
P JRE migration von Java 8+8 auf Java 8+17 Allgemeine Java-Themen 2
K Oracle Java Lizenzänderung ab Java 17 Allgemeine Java-Themen 2
HerrBolte Seltsamer Fehler nur in der Windows- und nicht in der Java-Console O_O Allgemeine Java-Themen 16
E Input/Output Eigene Datei mit java öffnen Allgemeine Java-Themen 9
IngoF Libraries in Java 11 Allgemeine Java-Themen 2
SaschaMeyer Gilt "_" als Java Keyword? Allgemeine Java-Themen 19
Master3000 Java Port reset (Socket) Allgemeine Java-Themen 6
Z Java Testklassenvariable ändern im Hauptprogramm Allgemeine Java-Themen 5
Master3000 JAVA Filereader Allgemeine Java-Themen 18
N A java Exception has occured Allgemeine Java-Themen 8
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Robertop Datumsformat für GB ab Java 16 Allgemeine Java-Themen 1
1Raini Java Warteschlange Allgemeine Java-Themen 21
Tobero .jar Dateine aus einem Ordner laden (Java 16) Allgemeine Java-Themen 5
Z WebApp mit Java verbinden. Allgemeine Java-Themen 8
M Vergleich C# und Java Allgemeine Java-Themen 24
S Bildrechte Java, HTML5 und PDF Symbole Allgemeine Java-Themen 5
P Bat Datei in Java ausführen Allgemeine Java-Themen 2
S Java öffnet immer im editor Allgemeine Java-Themen 1
Z macOS java konnte nicht entfernt werden xpc verbindungsfehler Allgemeine Java-Themen 4
A Java JDK ohne Oracle Konto Allgemeine Java-Themen 5
B Mit Java Click bei (x,y) machen? Allgemeine Java-Themen 6
S Java-Clicker Allgemeine Java-Themen 6
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
J Gmail Postfach und Java Allgemeine Java-Themen 6
E Java Website Login Allgemeine Java-Themen 2
D SHA-3 für Java-version 1.8 Allgemeine Java-Themen 1
N Regulären Ausdruck in normalen Java-Code umwandeln Allgemeine Java-Themen 12
X Java gewerblich nutzen mit externe Bibliothek. Was zu beachten? Allgemeine Java-Themen 18
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
A Java ListNode Element einfügen ohne Bibliothek Allgemeine Java-Themen 6
S Flächenermittlung von 3D-Modellen per Java? Allgemeine Java-Themen 8
sascha-sphw Erste Schritte Unit und Integration-Tests im Java Modul System Allgemeine Java-Themen 10
Q Java-Programmieren Allgemeine Java-Themen 1
mrBrown Java 16 ist seit heute verfügbar Allgemeine Java-Themen 12
1Raini Java if-Abfrage funktioniert nicht! Allgemeine Java-Themen 3
B BOT mit Java [Eclipse] programmieren Allgemeine Java-Themen 7
OnDemand Java Email Templates Allgemeine Java-Themen 2
V4ll3.Wff Array in Java Allgemeine Java-Themen 4
G Übermittlung zusätzlicher ASCII-Zeichen bei Übertragung von Dateiinhalt mit Xmodem - JAVA Allgemeine Java-Themen 9
D Java als anfänger Allgemeine Java-Themen 6
H was ist den dieses zur Kompilierzeit und zur Laufzeit in Java? Allgemeine Java-Themen 3
rtm007 Per Java Im Terminal Befehle eingeben. Allgemeine Java-Themen 4
J4n5chmiddi Methoden Website-URL im Browser öffnen nach erfolgreicher Basisauthentifizierung in Java Allgemeine Java-Themen 12
R Java Stream: Ist es möglich, einen stream zusammenzufassen Allgemeine Java-Themen 6
T Best Practice Java und unmodifiable Allgemeine Java-Themen 10
KeTho1712 Java Swing: JTable standardmäßig füllen, sodass bei Start bereits Datensätze gespeichert sind Allgemeine Java-Themen 1
Vanessa001 Hausaufgabe in Java Allgemeine Java-Themen 7
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
s_1895 Hilfe bei Java Tic Tac Toe Allgemeine Java-Themen 8
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
AGW in Java-Code plötzlich ein paar Wörter in Rot Allgemeine Java-Themen 2
F Java Console Allgemeine Java-Themen 2
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
AGW Java zu Kotlin Allgemeine Java-Themen 5
bax7891 Java Damals - Java Heute Allgemeine Java-Themen 6
tm.grp Teilsummenproblem in Java Allgemeine Java-Themen 2
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
N Lottowebsite programmieren mittels Java, HTML,.... Allgemeine Java-Themen 7
O Input/Output java.io.File beenden Allgemeine Java-Themen 5

Ähnliche Java Themen


Oben