Announcement

Collapse
No announcement yet.

Anfängerfrage zu Lambdaexpressions

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Anfängerfrage zu Lambdaexpressions

    Ich habe gerade versucht, als Übung einen Lambdaausdruck zu implementieren, was mir nicht gelungen ist, ich weiß aber ledier nicht weshalb.

    Hier ist meine Mainmethode, alles ist in den Kommentaren erklärt:

    Code:
    package core;
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    import core.Person.Sex;
    
    public class Main {
    	
    	
    	public static void evaluate(List<Person> list, Tester tester) {
    
    		for(Person p : list){
    		
    	       if(Tester tifc = (p.getName(), p.getAge(), p.getGender(), p.get) -> {}){
    	 
    	    	     System.out.println(p.printPerson());
    	    	   
    	       }
    	        
    	    }
    	}
    	
    	
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    
    //Ich erstelle hier eine Liste von Personen und alle Personen bekommen auch Eigenschaften gesetzt.
    List<Person> list = new ArrayList<>();
    		
      Person p1 = new Person();
      p1.setName("hapax");
      p1.setBirthday(1982,5,23);
      p1.setGender(Sex.MALE);
      p1.setEmailAddress("[email protected]");
      list.add(p1);
      
      Person p2 = new Person();
      p2.setName("balla");
      p2.setBirthday(1991,5,23);
      p2.setGender(Sex.MALE);
      p2.setEmailAddress("[email protected]");
      list.add(p2); 
      
      Person p3 = new Person();
      p3.setName("hapaxo");
      p3.setBirthday(2000,5,23);
      p3.setGender(Sex.MALE);
      p3.setEmailAddress("[email protected]");
      list.add(p3);
      
       
      
      /////////////////////////////////////////////////
      
    //Ich habe hier eine Methode evaluate, die bekommt als Argumente die Liste und einen Tester 
      evaluate(list, new TesterAgeGender());
    	
    	}
    
    }

    Der Tester, den ich als argument der Methode evaluate übergebe, implementiert das Interface Tester:

    Code:
    package core;
    
    import java.util.Date;
    
    public interface Tester {
    
    	public boolean test(String name, Date age, Person.Sex sex, String emailAddress);
    	
    }

    Hier ist die Implementierung – vereinfachend gebe ich mal immer einfach “true” zurück.
    Code:
    package core;
    
    import java.util.Date;
    
    public class TesterAgeGender implements Tester{
    
    	@Override
    	public boolean test(String name, Date age, Person.Sex sex, String emailAddress){
    		
    		return true;
    	}
    
    }

    Nun aber zur Methode evaluate in meiner Mainklasse. Bei
    Code:
      if(Tester tifc = (p.getName(), p.getAge(), p.getGender(), p.get) -> {}){
    v
    ...heißt es: Tester cannot be resolved to a variable. Ich weiß aber nicht, woran dies liegt. Ich habe eaber jre8 erfolgreich installiert :\

  • #2
    Tester ist in deiner MAIN-Klasse unbekannt. Das sollte dir die IDE (welche??) die du benutzt auch schon anzeigen. Importiere Tester.
    Des Weiteren ist mir nicht klar, was du mit der Expression bewirken willst.

    TesterAgeGender wird nicht benutzt??

    , p.get -> erscheint falsch, da fehlt doch was
    Zuletzt editiert von Christian Marquardt; 03.09.2015, 16:09.
    Christian

    Comment


    • #3
      Ich habe den Code mal modifiziert:

      Code:
      package core;
      
      
      import java.util.ArrayList;
      import java.util.List;
      
      import core.Person.Sex;
      
      
      
      public class Main {
      	
      		
      	public void evaluate(List<Person> list,Tester tester) {
      
      		for(Person p : list){
      		
      			if(tester.test(p.getName(), p.getAge(), p.getGender(), p.getEmailAddress())){
      				p.printPerson();
      			}
      				        
      	    }
      	}
      	
      	
      	/**
      	 * @param args
      	 */
      	public static void main(String[] args) {
      
      		Main m = new Main();
      		
      List<Person> list = new ArrayList<>();
      		
        Person p1 = new Person();
        p1.setName("hapax");
        p1.setBirthday(1982,5,23);
        p1.setGender(Sex.MALE);
        p1.setEmailAddress("[email protected]");
        list.add(p1);
        
        Person p2 = new Person();
        p2.setName("balla");
        p2.setBirthday(1991,5,23);
        p2.setGender(Sex.MALE);
        p2.setEmailAddress("[email protected]");
        list.add(p2); 
        
        Person p3 = new Person();
        p3.setName("hapaxo");
        p3.setBirthday(2000,5,23);
        p3.setGender(Sex.MALE);
        p3.setEmailAddress("[email protected]");
        list.add(p3);
        
         
        
        /////////////////////////////////////////////////
      
      //Ich implementiere durch den Lambdaausdruck die Interfaceklasse (ich gebe der Einfachheit halber imernoch immer nur true zurück)...  
      
      //Und schon hier kract es wieder, dabei steht doch tester in derselben Datei :\ "Syntax error on tokens."
      Tester testAgeGender = (String name ,int age ,Person.Sex gender,String email) -> { return true; }; 
        m.evaluate(list,testAgeGender);
      	
      	}
      	
      //Das Interafce habe ich in diese Datei reingezogen.
      	public interface Tester {
      
      		public boolean test(String name, int age, Person.Sex sex, String emailAddress);
      		
      	}
      }

      Comment


      • #4
        Den Syntaxerror beschreibt dir doch die IDE. Ein TESTER gibt es nicht in MAIN.
        Ggf. zippe die Sourcedateien ein und hänge sie hier ran
        Christian

        Comment


        • #5
          Ggf. zippe die Sourcedateien ein und hänge sie hier ran
          Oki, vielen Dank für das Angebot - ich habe mal alles als .zip exportiert und angehängt.
          Attached Files

          Comment


          • #6
            *.class sind compilierte Sourcecodedateien.

            Damit kann man nichts anfangen bzw. habe keine Lust die zu decompilieren
            Christian

            Comment


            • #7
              Entschuldige, da habe ich einen Fehler gemacht :\ Ich dachte, er würde in die .zip nich nur die .class-Dateien, sondern auch die .java-Dateien mitsenden, ich habe deshalb nicht mal in die .zip hineingeschaut. Ich habe nun mal den src-Ordner gezippt, allerdings habe ich aus dem lib-Ordner, der sich unter /src befindet, die guava-jar entfernt, denn diese ist zu groß, um sie als Anhang hochzuladen.
              Attached Files

              Comment


              • #8
                Habe das mal geändert.
                So richtig erschließt sich mir der Sinn nicht.
                Du belegst zwar testAgeGender, iterrierst dann mit jedem über die Liste. Somit wird jeder 1x gefunden.
                src.zip
                Christian

                Comment

                Working...
                X