Function<T,R>?

Alucardd

Mitglied
Kann mir jemand erklären wie man mit so einem Datentyp umgeht?
Wenn ich mir das Interface dazu anschaue steht da, dass T der Typ des angenommenen Werts und R der Typ des Ergebnis sein soll.
Also wie ne ganz normale Abbildung nehm ich an. T ist Typ von x und R ist Typ von f(x) sozusagen. Das kann ich mir soweit vorstellen solange T und R vom Typ Number sind und alles was davon erbt.

Aber hier das was ich nicht verstehe. Was wenn z.b T ein Objekt mit mehreren Integer Attributen ist etc und R vom Typ Java.awt.Color ? Das ergibt für mich kein Sinn. Also in der Aufgabe die ich bearbeiten soll macht es nur soweit Sinn da jedes dieser Objekte eine Farbe zugewiesen bekommt. Aber warum braucht man dafür eine Funktion? Und wo ist die eigentliche Funktion gespeichert? Muss man die noch mit lambda definieren oder existiert sie bereits wenn so ein Objekt erstellt wird?
 

LimDul

Top Contributor
Du denkst zu kompliziert :)

Function<T,R> heißt nur, das Interface definiert eine Funktion mit T als Eingabe und R als Rückgabe. That's it. Die Funktion wird meist als Lambda angeben, du kannst aber auch das Interface implementieren. Und wie aus T das R ermittelt wird ist das dann Frage der Programmierung.
 
K

kneitzel

Gast
Es geht doch nur darum, Funktionen in Variablen speichern zu können und diese Function<T,R> nimmt dann halt eine beliebige Methode, welche etwas vom Typ R entgegen nimmt und etwas vom Typ T zurück gibt.

Und so kannst Du sagen: Du willst etwas visuell mit Farben darstellen. Dazu wird eine Menge an Zahlen an eine Funktion gegeben und da kommt dann eine Farbe bei raus.
Du hast aber keine Ahnung, was das für eine Funktion ist, denn Du hast erst eine Variable definiert.

Was da wie drin ist, ist da erst einmal offen. So wie bei jeder Variablen....

Also nehmen wir einfach einmal:
Code:
public void someMethod(int a) { ... }
Was ist in a? Du weisst es nicht. Es kann alles sein. Du weisst nur: Es muss ein int Wert sein.

Genau so, geht es mit
Code:
public void someMethod(Function<Color, List<int>> func) { ... }
Was ist func? Du weisst es nicht. Du weisst nur, dass es eine Function ist, die ein List<int> entgegen nimmt und ein Color zurück gibt.

Wenn Du es dann nutzt, dann musst Du schauen: Es gibt evtl. schon fertig Methoden, die Du nutzen kannst. Das würde bedeuten, dass Du eine Methoden Referenz übergeben könntest.
Oder Du schreibst ein lambda Ausdruck. Das ist auch möglich.

Also das ist wie bei allen Variablen. Du willst halt unabhängig von etwas konkretem sein. So wie Du einer Variable zu Laufzeit neue Werte zuweisen kannst, ist das hier auch. Nur eben enthält die Variable dann halt jetzt etwas, das ausgeführt werden kann. (Function<T,R> hat die Methode apply. So gesehen ist da nichts wirklich Neues. Das ist wie bei jeder Instanz einer Klasse. Du kannst die Methoden darauf ausführen.
Wichtig ist hier wirklich, dass Du Methoden Referenzen und Lambdas speichern kannst, was einem einige Möglichkeiten gibt.

Ich hoffe, ich habe den Punkt, an dem es bei Dir derzeit etwas hakt, richtig erkannt.
 

TM69

Bekanntes Mitglied
Ich gehe mal davon aus du sprichst gerade von sogenannten Generics. http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_07_001.htm

Stell dir vor du hast eine Klasse, die für verschiedene Typen (String, Integer, Boolean, etc) dir Methoden zur Verfügung stellen. Dann kannst z.B. folgendes (shematisch) schreiben:

Code:
public class MyClass<T, R>
{
  private T value;

  private R value2;
 
  public MyClass() {}

  public MyClass( T value, R value2 ) {
       this.value = value;
       this.value2 = value2;
  }

  public void setValue( T value ) { this.value = value; }
  public void setValue2( R value ) { this.value2 = value2; }

  public T getValue() { return value; }
  public R getValue() { return value; }

}

Somit wird an der Position T der Typ T benutzt und an der Position R der Wert R. Wenn du jetzt eine Klasse ableitest z.B. wie folgt

Code:
public class AnotherClass extends MyClass<String, Integer>
{
}

Dann liefert dir setValue einen String zurück und setValue2 einen Integer.
Nachfolgend ein häufig benutztes Generic aus Spring.

Code:
Interface CrudRepository<T,ID>

Dieses Interface stellt Funktionalitäten für Create, Read, Update und Delete für Zugriffe auf Datenbanken zur Verfügung.

Möchtest du diese Funktionalitäten jetzt selbst benutzen, so brauchst du hiervon nur ableiten.
Code:
 public interface MyRepository extends CrudRepository<EntityClass, Long>

EntityClass ist hierbei der Name der Klasse die für die jeweilige Datentabelle verantwortlich ist.
Long gibt an das der Primary Key (PK) vom Typ Long ist.
 

Neue Themen


Oben