Iteration - Alte und neue For Schleife

kossy

Bekanntes Mitglied
Hallo !

Ich habe mal eine Frage zu den Iterationen über eine beliebige Datenstruktur mit einer For Schleife. Hier ist die Variante mit einer For Schleife vor der Java 5 Version:

Java:
public Textmodul getTextModulFromList(String textModulKey){		
    for(int i = 0; i < this.textModulList.size(); i++){		
       Textmodul currentTextModul = (TextModul) textModulList.get(i);			
       if(currentTextModul.getTextModulKey.equalsIgnoreCase(textModulKey)){
          return currentTextModul;		
       }		
    }		
}

Wie genau iteriert man jetzt eigentlich über eine For-Schleife in der Java Version >=5 ? Wie wird das dort mit dem "Casten" gehandhabt?

Danke für die Info !

Grüße
Kossy
 
Wenn deine Liste vom typ
Code:
List<Textmodul> textModulList
wäre, würde es wie folgt funktionieren:

Java:
public Textmodul getTextModulFromList(String textModulKey){     
    for (Textmodul currentTextModul : this.textModulList){
       if(currentTextModul.getTextModulKey.equalsIgnoreCase(textModulKey)){
          return currentTextModul;      
       }        
    }       
}

Gruß
 
Hallo !

Danke für die Antwort. Bedeutet das also, dass Java den Cast nun implizit durchführt und ich mich als Entwickler nun gar nicht mehr darum kümmern muss?

Grüße
Kossy
 
Hier ist die Variante mit einer For Schleife vor der Java 5 Version

Vor Java 5 hat man das auch nicht mit einer for gelöst, sondern einen Iterator verwendet:

Java:
        List<String> strings = new ArrayList<String>(Arrays.asList("foo", "bar"));

        Iterator<String> iter = strings.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }

        for (int i = 0; i < strings.size(); i++) {
            System.out.println(strings.get(i));
        }

        for (String s : strings) {
            System.out.println(s);
        }

Gibt dreimal
Code:
foo
bar
aus
 
Vor Java 5 hat man das auch nicht mit einer for gelöst, sondern einen Iterator verwendet:

Java:
        List<String> strings = new ArrayList<String>(Arrays.asList("foo", "bar"));

        Iterator<String> iter = strings.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }

        for (int i = 0; i < strings.size(); i++) {
            System.out.println(strings.get(i));
        }

        for (String s : strings) {
            System.out.println(s);
        }

Gibt dreimal
Code:
foo
bar
aus
vor Java 5 gab es keine Generics und wenn man eine List hatte konnte man ueber diese auch vor Java 5 mit einer for schleife iterieren. Natuerlich ist der iterations weg vorzuziehen.
 
vor Java 5 gab es keine Generics und wenn man eine List hatte konnte man ueber diese auch vor Java 5 mit einer for schleife iterieren. Natuerlich ist der iterations weg vorzuziehen.

Von was redest du?

[JAPI]http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html[/JAPI] :

Alle 3 Möglichkeiten haben ihre Berechtigung. Aber schön, wieder einen vom Pferd erzählt :applaus:
 
Es ist doch völlig egal, wann es Generics gab. Man hat sowohl vor als auch nach Java 5 Iterator verwendet. Die Methoden hasNext(), next() und remove() unterscheiden sich auch überhaupt nicht. Also behaupte bitte nicht, Iterator zu verwenden sei falsch oder was völlig neues. Danke :applaus:
 
Ich denke bygones ging es schlicht darum, dass dein Beispiel einerseits Generics verwendet, aber andererseits darübersteht, dass man das so vor Java 5 gemacht hatte, und das kann eben nicht sein.
 
Es ist doch völlig egal, wann es Generics gab. Man hat sowohl vor als auch nach Java 5 Iterator verwendet. Die Methoden hasNext(), next() und remove() unterscheiden sich auch überhaupt nicht.

Es ging in dem Kommentar nicht darum ob die Schnittstelle Iterator verwendet wurde oder nicht sondern darum das der folgende Code bei Versionen unter 5 nicht kompiliert da es bis dato keine Generics gab und man immer gezwungen war selbst zu casten da next() ein Object zurücklieferte.


Java:
        List<String> strings = new ArrayList<String>(Arrays.asList("foo", "bar"));
 
        Iterator<String> iter = strings.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }

Und damals hätte das hier (Generics entfernt):

Java:
List strings = new ArrayList(Arrays.asList("foo", "bar"));

ebenfalls nicht kompiliert da Arrays.asList() ein Array vom Typ Object erwartet hat.
 
vor Java 5 gab es keine Generics und wenn man eine List hatte konnte man ueber diese auch vor Java 5 mit einer for schleife iterieren. Natuerlich ist der iterations weg vorzuziehen.

Ok, sollte mich korrigieren... Das ist aus dem Zusammenhang gerissen...

Er: "Hier ist die Variante mit einer For Schleife vor der Java 5 Version"

Ich: "Vor Java 5 hat man das auch nicht mit einer for gelöst, sondern einen Iterator verwendet"

Korrekt müsste es lauten: Bevor es for-each gab, hat man entweder einen Iterator verwendet oder eine for-Schleife, wobei aber ein Iterator vorzuziehen ist

Dann du: "vor Java 5 gab es keine Generics" (unnötige Information)
"und wenn man eine List hatte konnte man ueber diese auch vor Java 5 mit einer for schleife iterieren" (aha, hab aber glaub ich nix gegenteiliges behauptet)
"Natuerlich ist der iterations weg vorzuziehen"

Keine Ahnung, was du mit "iterations weg" meinst, aber falls es sich dabei um Iterator handeln sollte, so stimmt diese Aussage ja wieder mit meiner überein

Ich hab mir jetzt zwar extra die Mühe gemacht, den Murks auseinander zunehmen, aber viel hängen bleiben wird bei dir wahrscheinlich eh nicht...

@maki und ThreadPool:
Natürlich würde der Code unter Java < 5 nicht kompilierbar sein, aber es ging darum zu zeigen, wie ein Iterator zu handhaben ist. Würde man Generics entfernen, würde dasselbe hasNext()-next()-Konstrukt übrig bleiben

Das ist mir auch langsam zu stressig hier
 
Die erweiterte For-Schleife gibt es erst seit Java 5. Eventuell wollte hüteüberhüte uns das mitteilen. 😕
 
@hüteüberhüte

deine Sätze
"Also behaupte bitte nicht, Iterator zu verwenden sei falsch"
"Dann du: "vor Java 5 gab es keine Generics" (unnötige Information)"
"Keine Ahnung, was du mit "iterations weg" meinst,"
klingen auch so als ob du die ganze Zeit nur mit bygones redest, dabei antworten inzwischen ganz andere

vielleicht wirklich mal Stress reduzieren, Postings genauer lesen usw.
 
Und damals hätte das hier (Generics entfernt):

Java:
List strings = new ArrayList(Arrays.asList("foo", "bar"));

ebenfalls nicht kompiliert da Arrays.asList() ein Array vom Typ Object erwartet hat.

Na und, was interessiert mich, was irgendwann mal nicht zu kompilieren war? Es ging darum, 3 verschiedene Wege zu verdeutlichen. Nicht mehr nicht weniger
 
Und was wolltest du mit diesen drei verschiedenen Wegen verdeutlichen?
Dass diese (nicht) vor Java 5 funktionieren? Oder dass diese besser sind?
 
Vor Java 5 hat man das auch nicht mit einer for gelöst, sondern einen Iterator verwendet

[EDIT]Vor Java 5 konnte man zwischen Iterator und for-Schleife wählen. Heute gibt es 3 verschiedene Möglichkeiten: Iterator, for-Schleife oder foreach. Bei manchen List-Implementierungen sollte man die for-Schleife aber vermeiden (LinkedList z.B.).

Generics und asList(T... a) gab es vor Java 5 auch noch nicht.

Das ist es jetzt hoffentlich "besser" oder verständlicher ausgedrückt.[/EDIT]
 

Neue Themen


Zurück
Oben