Lambda - kompliziertes filtern

Kababär

Top Contributor
Hi,

Ich habe eine xml Datei die, nicht vollständig hier aufgeführt, wie folgt aufgebaut ist:
Es gibt eine Lehrerliste, in der Lehrer als Objekte abgelegt sind. Ein Lehrer hat einen Stundenplan, wo unter anderem die von ihm zu unterrichtenden Fächer eingetragen sind.
Dann gibt es ein "No Relation" Objekt, das vorgibt was für den Lehrer nicht möglich ist, bspw weitere zu unterrichtende Fächer oder Lehrer, die nicht mit ihm in Beziehung stehen (rein thematisch) bspw Mathematik und BWL ( 😀 ).
Sieht circa so aus:
Code:
<lehrer_liste>
  <Lehrer Name"Boss">
    <stdp>
      <f_liste>
        <f Name="Bildverarbeitung">
         ...
      </f_liste>
    </stdp>
    <nr>
      <a_f> //Ausschluss Fächer
        <f Name="Erziehung"/>
        ...
      </a_f>
      <a_l> // Ausschluss Lehrer
        <Lehrer Name="Hugo"/>
        ...
      </a_l>
    </nr>
  </Lehrer>
  <Lehrer Name....>
  .....
  .....
  </Lehrer>
<Lehrer_liste>
Die xml habe ich mit JAXB eingelesen und mir stehen quasi alle Listen und Elemente sowie Attribute zu Verfügung und ich habe auch schon alles implementiert, aber die Klasse ist durch das ständige drüber iterieren aufgebläht und ich dachte mir eben: "Mensch, würdest du dich nur mit lambdas auskennen, könntest du ein Hexenwerk mit Filter, Flatmap und Co zusammenbrauen" und deshalb bin ich hier.
Was will ich letztendlich haben und wie habe ich es gemacht?
Ich bin zuerst über die Liste drüber und habe mir zwei Listen angelegt, eine für a_l und eine für a_f und habe da alles reingepackt was dementsprechend da drin steht.
Dann bin ich nochmal über jeden Lehrer und habe geguckt ob es ein a_f oder ein a_l gibt. Falls ja, merke ich mir den Namen des Lehrers und schreibe hinter diesen Lehrer alle Lehrer, die bei diesem Lehrer in a_l drin stehen und alle Lehrer, die ein Modul unterrichten, das in a_f drin steht.
Somit habe ich eine gute Übersicht über Lehrer und deren Relation zu Modulen und anderen Lehrern.
Geht so was auch mit lambdas?
Quasi eine mehrfache Iteration über eine Liste ohne explizit wieder die Liste aus der Hand geben zu müssen?

So etwas wie
Code:
LehrerListe.stream().filter(k -> k.hasAF || k.hasAL) Return k;
  .map(.....)
  .collect(....);
Bin mir gerade nicht mehr sicher wegen der richtigen Syntax. Aber kann ich aus einem Filter/einer map das Ergebnis zurückgeben und auf dem Ergebnis direkt weiterarbeiten?
 
Zuletzt bearbeitet:
map, filter etc geben immer einen Stream zurück, mit dem man dann weiterarbeiten kann...

Ich hab aber noch nicht so ganz verstanden, was du überhaupt vor hast, zeig mal Code 😉
 
Code:
<lehrer_liste>
  <Lehrer Name"Boss">
    <stdp>
      <f_liste>
        <f Name="Bildverarbeitung">
         ...
      </f_liste>
    </stdp>
    <nr>
      <a_f> //Ausschluss Fächer
        <f Name="Erziehung"/>
        ...
      </a_f>
      <a_l> // Ausschluss Lehrer
        <Lehrer Name="Hugo"/>
        ...
      </a_l>
    </nr>
  </Lehrer>
  <Lehrer Name....>
  .....
  .....
  </Lehrer>
<Lehrer_liste>

Hat nicht wirklich was mit deiner Frage zu tun, aber gewöhne dir bitte DRINGEND diese furchtbare Namensgebung ab.
a_f, a_l, stdp, .... das sind weder gute Variablennamen, noch sollte sowas als xml tags genutzt werden. Benutze sinnvolle Namen, das hilft nicht nur dir, sondern auch den Leuten die sich deinen Code ansehen werden.
 
Habe letztens noch folgendes verwendet, vielleicht hilft dir das ja weiter:

Java:
ArrayList<String> arr = new ArrayList<>();

// bla bla bla
 
List<String> filter = arr.stream().filter(a -> a.matches(".*[1-9]")).collect(Collectors.toList());

for (String string : filter)
{
  System.out.println(string);
}
 

Neue Themen


Zurück
Oben