Wert in einer Lambda Funktion erhöhen

FunkyPhil94

Mitglied
Hallo zusammen, wie kann ich einen Wert in einer Lambda Funktion erhöhen?
Die soll/muss ja final sein...

Das hier war mein Versuch:

Java:
    @Test
    void testApplyToAllString() {
        StapelMitArray<String> Stapel = new StapelMitArray(5);
        
        for (int i = 0; i < a.length; i++) {
            Stapel.insert("String" + i);
        }
        
        int count = 1;
        for (int i = 0; i < a.length; i++) {
            count ++;
            Stapel.applyToAll(wert -> wert.substring(0,count));

        }
        
        assertEquals("Strin", Stapel.remove());
        assertEquals("Stri", Stapel.remove());
        assertEquals("Str", Stapel.remove());
        assertEquals("St", Stapel.remove());
        assertEquals("S", Stapel.remove());
    }

Gibt es da ein Workaround?
 
Wenn Du eine Referenz hast, dann kann diese final sein und Du kannst aber den inneren Status verändern.

So eine Klasse kannst Du also selbst schreiben. Wenn es aber einfach nur um einen einzelnen primären Typ geht, dann kann eine Atomic* Klasse wie AtomicInteger (Java SE 17 & JDK 17) (oracle.com) genutzt werden.

Dein Code ist aber relativ dubios. Das, was Du da haben willst, dürfte deutlich einfacher zu machen sein. Einfach ein IntStream von 1 ... a.length um dann i -> stapel.insert("String".substring(0,i)) zu machen.

Aber Das wäre auch noch mangelhaft, da Du den Stapel, der außen ist, veränderst. Daher wäre es besser, mit map zu arbeiten, also den IntStream von 1 ... gewünschteLänge um da dann ein mapToObj aufzurufen (i -> "String".substring(0,i)) und dann kommt am Ende das Collect in den Stapel. (Da ist aber natürlich die Frage, ob die Klasse alle Voraussetzungen hat, um da verwendet werden zu können. Da das eine selbst geschriebene Klasse ist, vermute ich fast, dass dieses Vorgehen daran scheitern wird.

Und der Code sieht etwas dubios aus:
applyToAll dürfte ja alle Elemente verwenden - wozu dann die Schleife über alle Elemente? Das passt nicht!
 
Hätte wahrscheinlich mehr ausholen sollen 🙂

Was atomic* Klassen oder auch IntStream angeht bin ich raus bzw. Müsste ich mich dort erst einlesen (2. Semester Informatik Studium).

Die Aufgabe war/ist ein Array mit verschieden Datentypen zu füllen und diese zu testen.
Hoffe das erklärt so die meisten Unklarheiten...

Es wurden dabei Integer und Character schon in einer separaten Test-Methode getestet.
Hätte man natürlich auch zusammenfassen können.

Gibt es denn die (einfache) Möglichkeit ohne IntStream, Atomic*Klassen so etwas zu lösen/ zu umgehen?

Sorry, Wissen ist (noch) relativ begrenzt 🙂
 
Die Atomic Klassen sind nichts besonderes. Wie geschrieben: Du kannst Dir so eine Klasse selbst schreiben. Es reicht eine Klasse mit einem public int value; Feld. Dann hast Du eine Referenz auf eine Instanz und die ist dann final. Und Du kannst dann das Feld darin verändern.
 

Neue Themen


Zurück
Oben