it-swarm.dev

Ist funktionale Programmierung in Java möglich?

Ich habe im Amazon.com Bookstore gestöbert und bin auf das Buch gestoßen "Functional Programming for Java Developers" .

Ich kenne einige sehr grundlegende funktionale Programmierung und programmiere seit 3 ​​Jahren in Java).

Ich würde gerne wissen, ob funktionale Programmierung in Java überhaupt möglich ist.

42

Es kommt darauf an, was Sie unter "funktionaler Programmierung" und unter "möglich" verstehen.

Sie können offensichtlich Dinge implementieren, die einem funktionalen Paradigma folgen. Die Sprache Java liefert jedoch nicht den syntaktischen Zucker dafür, so dass einige Dinge bestenfalls langweilig und andere extrem geheimnisvoll sind.

In ähnlicher Weise können Sie sehr gut objektorientierten Code in einer Sprache schreiben, die als Nicht-OO erkannt wird, wie z. B. C.

Java-Bibliotheken

Es gibt Bibliotheken, die Ihnen dabei helfen können, indem sie bereits die Beinarbeit für Sie erledigen und die arkanen Dinge verstecken:

Auf diese Weise können Sie Java Code mit einem funktionaleren Ansatz und möglicherweise vertrauterer Syntax und Semantik schreiben, als Sie es von einer FP-kompetenten Sprache erwarten würden.

JVM-Sprachen

Und natürlich können Sie eine funktionale Sprache zusätzlich zu Java implementieren . Damit Sie diese dann als Ihre FP Sprache) verwenden können. Dies ist eine etwas höhere Abstraktionsebene als das, was Sie verlangt haben, aber relativ im Kontext (obwohl ich a betrüge) bisschen hier, selbstverständlich).

Überprüfen Sie zum Beispiel:

Mehr oder weniger funktionale JVM-Sprachen

Obwohl sie möglicherweise nicht genau das sind, was Sie wollen, gibt es eine Reihe anderer Sprachen, die auf die Java Plattform) portiert wurden und die Sie möglicherweise von Javas relativ nicht so spaßorientierter Sprache befreien (ja, Wortspiel beabsichtigt) Natur und geben Ihnen bereits mehr Flexibilität. Bemerkenswerte Konkurrenten wie JRuby , Jython und Rhino (jeweils für Ruby =, Python und JavaScript / ECMAScript ) bieten ebenfalls ein interessantes Potenzial für die funktionale Programmierung, obwohl sie von Natur aus wohl keine wirklich funktionalen Programmiersprachen sind. JetBrains ' Kotlin erkennt zwar eindeutig an, dass es sich nicht um eine funktionale Sprache handelt, unterstützt jedoch einige funktionale Konstrukte und ist auch einen Blick wert.

Weiterführende Literatur

Vielleicht möchten Sie auch diese Artikel oder Videos lesen oder ansehen:

70
haylem

Ich lese das Buch, das Sie erwähnt haben. Es ist wirklich gut, übrigens.

Ja, es ist möglich, in Java funktionsfähig zu sein. Ich weiß nicht, inwieweit Sie es erreichen können, aber Sie können viele funktionale Programmiersprachen implementieren.

Eines der wichtigsten Dinge ist der Versuch, mit der Mentalität "Nicht mutieren" zu codieren.

Zum Beispiel verwenden Sie das Schlüsselwort final, um Unveränderlichkeit zu erreichen. Wenn Sie eine Datenstruktur verwenden möchten, sollten Sie unveränderliche Datenstrukturen codieren. Die Google Guava-Bibliothek tut dies bereits.

Auch für die gleichzeitige Programmierung können Sie sich auf das Akka-Framework (das Akteurmodell) verlassen.

Es ist erwähnenswert, dass der JVM-Bytecode (zumindest noch) keine Tail-Call-Optimierung unterstützt, eine sehr wichtige Funktion für funktionale Programmiersprachen.

11
Chiron

Ja, es ist definitiv möglich, genauso wie es in jeder Kombination aus Sprache und Ausführungsumgebung möglich ist. Sie können sogar eine recht gute Leistung erzielen, wenn Sie wissen, was Sie tun.

Ich bin mir nicht sicher, wie vernünftig es ist. Beachten Sie insbesondere, dass es nicht besonders idiomatisch ist (d. H. Es wird sehr seltsam aussehen, Sie müssen einige unkonventionelle Dinge tun und Leute verwirren, die an normales Java gewöhnt sind).

Am Ende erhalten Sie einen seltsam aussehenden Code, z. So definieren Sie eine neue Funktion:

Function twoStrings=new Function() {
  public Object apply(Object param1) {
    // do something to param1 and return a result
  }
}

Für die funktionale Programmierung benötigen Sie normalerweise:

  • Erstklassige Funktionen - einfach zu erstellen in Java durch Definieren einer abstrakten Klasse oder Schnittstelle, die Ihre "Funktion" und darstellt hat eine "apply" -Methode, die die Funktion auf einen oder mehrere Parameter anwendet.
  • Closures - Erstellen Sie eine Instanz Ihres obigen Funktionsobjekts mit den geschlossenen Werten, die in den letzten Feldern gespeichert sind. Sie können hierfür eine anonyme innere Klasse verwenden.
  • Eine Bibliothek mit Standardfunktionen höherer Ordnung - dies ist schwieriger, Sie können jedoch immer noch Ihre eigenen in bootstrap a simple) schreiben Funktionssprache in wenigen Stunden. Wenn Sie etwas ausgefalleneres möchten, können Sie sich andere Funktionsbibliotheken ansehen, die in Java erstellt wurden.

So ist es als Übung und sogar als interessantes Hobbyprojekt möglich. Aber Sie möchten wirklich ernsthafte funktionale Programmierung durchführen und dabei die Vorteile der JVM beibehalten/auf Java Bibliotheken dann Clojure ) zugreifen bei weitem Ihre beste Option meiner Meinung nach.

p.s. Da der Kern von Clojure tatsächlich in Java geschrieben ist, ist es tatsächlich ein sehr interessantes Beispiel für die Funktionsprogrammierung in Java, während die chaotischen Details hinter einer netten neuen modernen Sprachsyntax verborgen werden. - Clojure-Quellcode ist auf GitHub für Interessierte.

6
mikera

Es ist möglich, in Java etwas funktional zu sein. Dies zu tun ist ernsthaft schmerzhaft. Anstatt

myList.each { doSomething(it); }

Sie haben so etwas wie:

myList.each(new Function() { public void do(Object arg) { something(); }})

Und wenn Sie eine echte funktionale Programmierung mit Abschlüssen und Funktionen als erstklassige Objekte wünschen, wählen Sie eine andere Sprache. Scala, Clojure und Groovy laufen alle auf der JVM und können mit älteren Java Klassen) interagieren.

4
kevin cline

Die Antwort ist ein klares "Ja, natürlich", aber meiner Meinung nach ist eines der wichtigsten Merkmale in vielen funktionalen Sprachen das ausgezeichnete Typensystem. Sie werden dies niemals in Java selbst) verwalten können.

Wenn Sie funktionale Programme schreiben und dennoch bei der JVM bleiben möchten, kann ich unter den üblichen Verdächtigen empfehlen, Scala und Clojure zu betrachten Frege . Frege hat eine Syntax und einen Typ System, das Haskell sehr nahe kommt, aber Programme werden direkt in Java Code) übersetzt und können mit anderem Java Code) interagieren.

3
Ingo

Nun, alle möglichen Dinge sind möglich. Es ist möglich, objektorientierte Programmierung in C durchzuführen. Es ist einfach keine sehr gute Idee.

Java wurde nicht für FP entwickelt. Wenn Sie also versuchen, alles in einem reinen FP-Stil auszuführen, treten Probleme auf. Sie werden gegen die Sprache kämpfen, anstatt damit zu arbeiten. Und nicht nur die Sprache - es gibt auch all die wunderbaren kostenlosen Java Bibliotheken). Entscheiden Sie sich also nicht für reine FP; nehmen Sie einige der Ideen hinter FP und Integrieren Sie sie in Ihren Java Code, aber verstehen Sie, dass Sie das nicht tun können, um alle die Ideen.

2
Mike Baranczak

Das OpenJDK-Team empfiehlt Ihnen, die neuesten OpenJDK 8-Binärdateien herunterzuladen und mit den neuen Lambda-Ausdrücken und den neuen funktionalen Redewendungen zu spielen, die unter anderem in der Collections-API eingeführt wurden. Sie können in einem klaren Funktionsstil programmieren. Siehe "Funktionale Programmierung in Java?" für einen Vergleich der JDK8-Sammlungen mit Bibliotheken vor Java8 wie Guava, FunctionalJava und LambdaJ.

0
JohanN