for Schleife in allgemeingültiges Konstrukt aus Stream und Lambdas

werdas34

Bekanntes Mitglied
Hallo,
ich versuche gerade ein Konstrukt zu basteln, was mir dasselbe Resultat liefert wie die for Schleife, wenn der Rumpf identisch ist. Ich weiß, dass das nicht der Sinn von Streams ist, aber ich brauche ein Notfallkonstrukt, falls ich in der Prüfung auf keine sinnvolle Stream/Lambda-Lösung komme.
Momentan siehts so aus:
Java:
        IntStream.range(from, to).forEach(i -> {
            // do sth
            System.out.println(i);
        });

        for (int i = from; i < to; i++) {
            // do sth
            System.out.println(i);
        }
Soweit ich es getestet habe funktioniert alles, wenn im Rumpf selbst kein Wert neu beschrieben wird, da effectively final.
Kann man dieses Konstrukt erweitern/abändern, dass selbst solche Sachen wie effectively final kein Problem darstellen? Bedingung ist: es dürfen keine Schleifen verwendet werden.

thx
MFG werdas34
 
i muss in dem Fall nicht "effectively final" sein, die Frage erübrigt sich, zum Beispiel:
Java:
IntStream.range(0, 5).forEach(i -> {
    i = 42;
    System.out.println(i);
});

ohne weiteres möglich.... 😱

Dann ist noch "fraglich", inwiefern das Lambda Konstrukt (welches eine normale Methode darstellen tut), welches eine IntConsumer Instanz erwartet, allgemein sinnvoll ist - und es immer angewandt werden soll.
 
i muss in dem Fall nicht "effectively final" sein, die Frage erübrigt sich, zum Beispiel:
ohne weiteres möglich.... 😱
Aber alle lokalen Variablen außerhalb des Lambdas sind effectively final.

Dann ist noch "fraglich", inwiefern das Lambda Konstrukt (welches eine normale Methode darstellen tut), welches eine IntConsumer Instanz erwartet, allgemein sinnvoll ist - und es immer angewandt werden soll.
Das Lambda-Konstrukt erwartete keine IntConsumer-Instanz, sondern "ist" eine 😉 Und dass es nicht sinnvoll ist, sagt @werdas34 schon selbst...

Kann man dieses Konstrukt erweitern/abändern, dass selbst solche Sachen wie effectively final kein Problem darstellen? Bedingung ist: es dürfen keine Schleifen verwendet werden.
Nein.

(Bzw, was sind "solche Sachen", außer effectively final?)
 
Ich schreibe demnächst eine Prüfung (auf Papier und ohne API) und Lambda/Streams werden ein Teil davon sein.
Unsere Übungen waren recht simpel. Aber die Aufgaben sind gewöhnlich um einiges anspruchsvoller.
Lambda/Stream sind ja doch etwas eigen, deshalb wäre so ein Konstrukt ganz passend. Vorallem da wir oft die Aufgabe haben eine for Schleife in Lambda/Streams umzuschreiben.
Bsp. Sie haben eine Liste mit Werten. Schreiben Sie eine Methode die das mittels Lambda Stream macht.
Java:
      IntStream.range(0, list.size()).forEach(i -> {
            // do sth
            System.out.println(list.get(i));
        });

           list.stream().forEach(System.out::println);

        for (int i = 0; i < list.size(); i++) {
            // do sth
            System.out.println(list.get(i));
        }

Aber wenn ich jetzt eine Liste mit double Werten habe und diese aufsummiere, dann kann ich mein Konstrukt nicht anwenden, sondern:
double sum = list.stream().mapToDouble(i -> i.doubleValue()).sum();
oder was anderes.
Das weiß ich, aber ohne API werden dann andere Fälle evtl schwierigier.
Deshalb wäre es gut, wenn man ein halbwegs universielles Konstrukt hat, das wie eine for Schleife aufgebaut ist aber keine ist. 😀

Oft sind die Aufgaben so, dass man eben keine Schleife verwenden soll und die Aufgabe mit Java8 lösen soll.
Ich hoffe das klärt jetzt alles. 😀
 

Neue Themen


Zurück
Oben