Methoden als Parameter anderer Methode verwenden

PaperHat

Mitglied
Hey! Wie der Titel schon besagt habe ich eine Frage bezüglich Methoden als Parameter anderer Methoden und zwar frage ich mich, ob das möglich ist. Habe mich schon bei Google durchgewühlt, aber irgendwie nicht das gefunden, was ich zur Lösung meines Problemes benötige. Weiß vielleicht jemand ob und wie das funktioniert? Danke fürs antworten 🙂
 
Hast du denn ein Beispiel, was du machen möchtest?

Java:
public class Klassenname{
public static void main(String[] args) {
       
        System.out.println(formel(double, int, double);
        System.out.println(formel2());
//hier soll dann das Ergebnis ausgegeben werden
    }

   
    public static double formel(double p, int l, double radius)
    { 
        return p*(l/(Math.PI * radius * radius));
    } 
//Berechnung der ersten Formel
   
    public static double formel2(x,int i)
// an der Stelle des x dann die Formel 
    {
        return x* i; 
    }
//Berechnung des Wertes, der eben von formel abhängt
}

So was, keine Ahnung aber in wie fern das realistisch ist tbh. Bisher habe ich einfach die erste Formel noch in der zweiten ausgeschrieben, hab mir aber gedacht, dass das eventuell schöner geht 😀
 
In dem Fall wäre es ganz einfach, weil in Deiner formel2-Methode gar keine Funktion sondern einfach nur ein Wert erwartet wird: formel2(formel(p,l,r), i);
 
Kleines Beispiel für die Übergabe einer Funktion...

Java:
public class SearchDemo {
    public static List<String> executeSearch (List<String> searchIn, String searchFor,
            BiPredicate<String, String> searchBy) {
       
        return searchIn.stream()
                .filter(str -> searchBy.test(str, searchFor))
                .collect(Collectors.toList());
    }
   
   
    public static void main(String... args) {
        List<String> list = Arrays.asList("Foo", "foo", "Bar", "FooBar", "BarFoo");
       
        System.out.println(executeSearch(list, "Foo", String::equalsIgnoreCase));
        System.out.println(executeSearch(list, "Foo", String::equals));
        System.out.println(executeSearch(list, "Foo", String::startsWith));
        System.out.println(executeSearch(list, "Foo", String::contains));
    }
}

Code:
[Foo, foo]
[Foo]
[Foo, FooBar]
[Foo, FooBar, BarFoo]
 
@MoxxiManagarm Nachdem der searchstring so und so an das Predicate gebunden ist, kann man auch:
Java:
public static List<String> executeSearch (List<String> searchIn, Predicate<String> predicate) {
  return searchIn.stream().filter(predicate).collect(Collectors.toList());
}
und
Java:
System.out.println(executeSearch(list, "Foo"::equalsIgnoreCase));
 
Hier muss du aufpassen, was du fragst 🙂
Wenn du meinst, das ERGEBNIS einer Methode sollte als Parameter für eine andere verwendet werden, ist das eine vollkommen andere Thematik, als wenn du fragst, ob eine Methode als Parameter verwendet werden kann.
Das eine ist Grundwissen, das andere geht Richtung Lambda und die Antworten sind vollkommen verschieden.
mihe hat - denk ich - dein Problem recht einfach gelöst.
 
Normaler weise macht man das über Interface-Klassen (in C machte man das ueber sog FunktionsPointer)
. Aber ich glaub, da liegt bei deinem Ansinnen ein Denkfehler vor.
mach doch einfach wie @mihe oben schon gesagt hat:

formel2(formel(p,l,r), i);



Wenn du (wirklich) mal funktions pointer brauchst liest das (z.B bei Ullenboom)
nach. Aber n dem Beispiel unten siehst du, dass dass nicht das ist was du willst

PS:
1) Du erstellst erstmal eine Interface-Klasse die sehr easy ist und meist nur eine func enthaelt
-quasi eine Auflistung von funktionen

Java:
public interface IntfMeineFormeln
{
    public double meineFormel(double p,int ein_l,double radius);
}

2) Dann erstellt du eine (ich nenn sie immer worker klasse, quasi Klasse zum Interface)
Muss alle Methoden des Interfaces implementieren (hier nur meineFormel)
Java:
public class Formel implements IntfMeineFormeln

mit einem Konstruktor z.B
Java:
public Formel(double p,int ell,double radius)
{
   this.p = p; this.l = ell; r = radius;
}
public double getVal() { return p*(l/(Math.PI * r * r));
...

3) Bevor du formale2() aufrufst mach dann:

Java:
Formel funcPointer = new Formel(p,l,radius);

und dann:

Java:
double result = formel2(funcPointer,i);
mit
Java:
public static double formel2(Formal method,int i)
 {
        return method.getValue() * i; // hier siehst du wie unsinnig das ist
 }
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben