Closures

n01sp

Mitglied
Java:
package de.closures;

import java.util.Scanner;
import java.util.function.Function;

public class Closures {

   
    static void greetings(String name){
        /**
         *  TODO Implementieren des Functional Interface
         */
        welcomeMessage(greeter);
    }
   
    static void welcomeMessage(Function<String, String> greeter){
        /**
         *  TODO Aufrufen des Functional Interfaces
         */
        System.out.println(...);
    }
   
    public static void main (String args[]){
        System.out.println("What's your name?");
        Scanner scanner = new Scanner(System.in);
        String greeting = scanner.nextLine();
        greetings(greeting);
        scanner.close();
    }
   
   
}

Dazu solle ich eine Closure Funktion mit Hilfe von Lambda Ausdrücken. Mein Problem ist dieses Wort CLosure ich versteh nicht ganz was damit gemeint ist. Ich würde so vorgehen, dass ich ein externes Funktionales Interface schreibe mit der Methode die halt Hallo irgendwas ausgibt und die dann ganz normal aufruft. Aber anscheinend soll ich das ja irgendwie anders machen.
 

n01sp

Mitglied
Verstehe ich es richtig, dass ich für jede variable , die außerhalb des scope liegt, eine Klasse erstellen muss und dann mit Objekten von dieser Klasse arbeite?
 

dayaftereh

Top Contributor
Du kannst das machen :

Java:
Function<Integer, Integer> add = (x, y) -> x + y ;
assert( add(1,2) == 3);
 

n01sp

Mitglied
Java:
    static void greetings(String name){
        /**
         *  TODO Implementieren des Functional Interface
         */
        Function<String, String> greeter = (x) -> x = name;  ;
       
        welcomeMessage(greeter);
    }
   
    static void welcomeMessage(Function<String, String> greeter){
        /**
         *  TODO Aufrufen des Functional Interfaces
         */
        System.out.println("Hello " + greeter);
    }

ich hab das jetzt erstmal so gemacht. Allerdings weiß ich noch nicht wie ich statt die Speicheradresse den Inhalt vom Lambda Ausdruck ausgebe.
 

dayaftereh

Top Contributor
Ok ich glaube du hast es noch nicht....
Schau mal:
Java:
public static String read(){
  Scanner scanner = null;
  try {
    System.out.println("What's your name?");
    scanner = new Scanner(System.in);
    String line = scanner.nextLine();
    return line;
  } finally {
    if(scanner != null) {
      scanner.close();
    }
  }
}
public static greeting(Supplier<String> input, Function<String, String> output ) {
  String name = input();
  System.out.println(output(name));
}
public static void main (String args[]){
  greeting(Klasse::read, name -> "Hello " + Name);
}
 

n01sp

Mitglied
Ok also mal sehen ob ich das verstehe. Also er ruft die methode greetings auf und kriegt eiegentlich ein String zurück, aber da wir das mit den doppelpunkten(diese weise Methoden aufzurufen haben wir nur oberflächlich behandelt) ist der return typ egal. So dann definieren wir quasi die Function beim aufruf von greeting. In der Methode haben wir dank des Suplliers die Eingabe gespeichert und speicher sie in einem String und rufen damit dann dei Funktion auf.
Fazit: Also ist es sinnvoll Supplier zu benutzen wenn man Paramet übergeben will?
 

dayaftereh

Top Contributor
Das coole ist das du jetzt folgendes machen kannst:
Java:
greeting(() -> "Java", name -> name + " ist cool.");

Du kannst greeting jetzt für verschiedene Zwecke benutzen. Was es eigentlich tut ist String concatenation. Der Name muss nicht vom Input Stream kommen, sondern könnte auch Komplex verschlüsselt von einer Webseite geparst werden. Aber du kannst trotz dem deine Methode greeting benutzen...
 

Neue Themen


Oben