# Actor Reader



## wxrrja@ (16. Dez 2022)

Aufgabe : Der Reader hat ein Input-Objekt, das seinem Konstruktor übergeben wird.

Erhält der Reader eine beliebige Textnachricht, so beginnt er Textzeilen vom Input-Objekt zu lesen. Jede Textzeile sendet er dem Absender einzeln ohne Zeilenumbruchzeichen.

Der Reader liest so lange vom Input, bis ein EOF anliegt. (Eingabe an der Tastatur von STRG + Z bei Windows bzw. STRG + D bei UNIX)

Zum Schluss sendet der Reader noch ein EOT-Zeichen (End-Of-Transmission: "\u0004").

Oder anders formuliert:

Ein einziger Aufruf der tell-Methode des Readers ruft die tell-Methode des Absenders für jede vom Input gelesene Textzeile auf.


Natürlich widerstehen Sie jetzt der Versuchung, eine Schleife zu programmieren.

Wie kann ich das darstellen? soll ich hierfür die thread method wählen .. wäre sehr nett wenn mir da jmd weiterhelfen könnte?


LOCIFS


----------



## mihe7 (16. Dez 2022)

Dazu müssten wir schon mehr wissen (was ist Reader? Was Input usw.), ansonsten kann ich Dir auch einfach

```
public void loeseAufgabe(Reader input, Absender absender) {
    new BufferedReader(input).lines().forEach(absender::tell);
}
```
schreiben.


----------



## wxrrja@ (19. Dez 2022)

Danke für die Antwort, ich habe folgendes implementiert

public class Reader extends AbstractActor<String> {


    private final Input input;
    private final Actor<String> producer;

    public Reader(String id, Type type, Input input, Actor<String> actor) {
        super(id, type);
        this.input = input;
        this.producer = actor;

    }

    @Override
    public void onReceive(String message, Result<Actor<String>> sender) {


        new BufferedReader (input).readLines().forEach(x -> line -> sender.forEach(prod-> prod.tell((line, Result.of(producer))));

        sender.forEach(stringActor -> stringActor.tell(EOT, Result.of(producer)));


----------



## mihe7 (19. Dez 2022)

Kompiliert das? Ich frage nur, weil - wie bereits geschrieben - wir die Typen nicht kennen, die Du da verwendest. Es kann also sein, dass das klappt, muss aber nicht.


----------



## KonradN (19. Dez 2022)

mihe7 hat gesagt.:


> Kompiliert das?


Kann das denn (sinnvoll) übersetzen?

Dieses Konstrukt sieht zumindest dubios aus:
`x -> line -> sender.forEach(...)`

Das 'x ->' dürfte zu viel sein. Ansonsten wird für jede Zeile (halt das x) ein Lambda gesetzt (der dann nie ausgeführt würde).
Ohne das jetzt weiter zu prüfen wäre da mein Ansatz, dass da im Lambda doch ein Statement sein müsste und die Deklaration eines Lambdas ist kein Statement sondern nur eine Expression, die halt ein Lambda angibt. (Rede ich gerade wirr? Bin mir gerade nicht sicher, dass ich die richtigen Begriffe gefunden habe ... Muss die JLS wieder unters Kopfkissen legen und dann Abends vor dem Schlafen lesen  )


----------

