Ich habe im Amazon.com Bookstore gestöbert und bin auf das Buch "Functional Programming for Java Developers" gestoßen .
Ich kenne einige sehr grundlegende Funktionen und programmiere seit 3 Jahren in Java.
Ich würde gerne wissen, ob Functional Programming überhaupt in Java möglich ist.
java
functional-programming
Vinoth Kumar CM
quelle
quelle
Antworten:
Es kommt darauf an, was Sie unter "funktionaler Programmierung" und "möglich" verstehen.
Sie können offensichtlich Dinge implementieren, die einem funktionalen Paradigma folgen. Die Java-Sprache bietet jedoch nicht den syntaktischen Zucker dafür, so dass einige Dinge bestenfalls langweilig und andere äußerst arkane sein werden.
In ähnlicher Weise können Sie objektorientierten Code sehr gut 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, wie Sie es von einer FP-fähigen Sprache erwarten würden. In Ordnung, das ist.
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. Das ist ein bisschen mehr Abstraktion als gewünscht, aber relativ im Kontext (obwohl ich hier ein bisschen betrüge, zugegeben).
Schauen Sie sich zum Beispiel Folgendes an:
Mehr oder weniger funktionale JVM-Sprachen
Auch wenn sie möglicherweise nicht genau Ihren Wünschen entsprechen, gibt es eine Reihe anderer Sprachen, die auf die Java-Plattform portiert wurden und Sie möglicherweise von Javas relativ nicht so spaßiger Natur (ja, Wortspiel beabsichtigt) befreien und Ihnen bereits mehr bieten Flexibilität. Bemerkenswerte Konkurrenten wie JRuby , Jython und Rhino (jeweils für Ruby , Python und JavaScript / ECMAScript ) bieten ebenfalls ein interessantes Potenzial für funktionale Programmierung, obwohl sie von Natur aus keine wirklich funktionalen Programmiersprachen sind. JetBrains KotlinAuch wenn klar ist, dass es sich nicht um eine funktionale Sprache handelt, werden einige funktionale Konstrukte unterstützt, und es lohnt sich auch, einen Blick darauf zu werfen.
Weitere Lektüre
Vielleicht möchten Sie auch diese Artikel oder Videos lesen oder ansehen:
quelle
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, bis zu welchem Grad Sie es erreichen können, aber Sie können viele funktionale Programmiersprachen implementieren.
Eines der wichtigsten Dinge ist der Versuch, mit der Mentalität "Don't Mutate States" 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.
Erwähnenswert ist, dass der JVM-Bytecode (zumindest noch) keine Tail-Call-Optimierung unterstützt, eine sehr wichtige Funktion für funktionierende Programmiersprachen.
quelle
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 (dh es wird sehr seltsam aussehen, Sie müssen einige unkonventionelle Dinge tun und Leute verwirren, die an reguläres Java gewöhnt sind).
Sie werden am Ende einen seltsam aussehenden Code haben, z. B. um eine neue Funktion zu definieren:
Für die funktionale Programmierung benötigen Sie normalerweise:
Das ist also als Übung und sogar als interessantes Hobbyprojekt möglich. Aber Sie möchten wirklich ernsthafte funktionale Programmierung durchführen und gleichzeitig die Vorteile der JVM erhalten / auf Java-Bibliotheken zugreifen, dann ist Clojure meiner Meinung nach bei weitem die beste Option.
ps Da der Kern von Clojure tatsächlich in Java geschrieben ist, handelt es sich um ein sehr interessantes Fallbeispiel für die Funktionsprogrammierung in Java, bei dem die chaotischen Details hinter einer schönen neuen modernen Sprachsyntax verborgen bleiben. Clojure-Quellcode ist auf GitHub für Interessierte.
quelle
Es ist möglich, in Java etwas funktionsfähig zu sein. Dies ist sehr schmerzhaft . Anstatt von
Sie haben so etwas wie:
Und wenn Sie eine echte funktionale Programmierung mit Verschlü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. .
quelle
Die Antwort ist ein klares "Ja, natürlich", aber meiner Meinung nach ist eines der wichtigsten Merkmale in vielen funktionalen Sprachen das exzellente Typensystem. Sie werden dies in Java niemals selbst verwalten können.
Wenn Sie funktionierende Programme schreiben und dennoch bei der JVM bleiben möchten, kann ich unter den üblichen Verdächtigen Scala und Clojure empfehlen, sich Frege anzuschauen . Frege hat ein Syntax- und Typsystem, das Haskell sehr ähnlich ist, aber Programme werden direkt in Java-Code übersetzt und können mit anderem Java-Code interagieren.
quelle
Nun, alles Mögliche ist möglich. Objektorientierte Programmierung ist in C möglich. 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 die Sprache bekämpfen, anstatt damit zu arbeiten. Und nicht nur die Sprache - es gibt auch all die wunderbaren kostenlosen Java-Bibliotheken. Entscheide dich also nicht für reine FP; Nehmen Sie einige der Ideen, die hinter FP stehen, und integrieren Sie sie in Ihren Java-Code. Verstehen Sie jedoch, dass Sie nicht alle Ideen damit bearbeiten können.
quelle
Sie werden vom OpenJDK-Team ermutigt, die neuesten OpenJDK 8-Binärdateien herunterzuladen und mit den neuen Lambda-Ausdrücken und den neuen funktionalen Idiomen zu experimentieren, die unter anderem in der Collections-API eingeführt wurden. Sie können in einem klaren funktionalen Stil programmieren. Siehe "Funktionale Programmierung in Java?" für einen Vergleich von JDK8-Sammlungen mit vor Java8-Bibliotheken wie Guava, FunctionalJava und LambdaJ.
quelle
Es mag möglich erscheinen, aber es wird keine reine Funktionsprogrammierung sein. Dies kann zu einer zwingenden Programmierung führen.
Es ist keine Frage, warum er mit möglicher funktionaler Programmierung gemeint ist, wie von Haylem erwähnt. Hier ist es:
Die funktionale Programmierung kann keine unterschiedlichen Definitionen oder Bedeutungen haben, obwohl sie viele Erklärungen haben kann.
Können wir wie OOP fragen, "was meinst du mit OOP?".
Auf jeden Fall wird es viele Erklärungen geben, aber es wird sich nur um ein Ziel handeln, das Ziel von OOP.
Gleiches gilt für die funktionale Programmierung .
Wenn wir funktionale Bedeutung sagen, bestehen die Programme aus Funktionen.
Die Funktion besteht darin, ein ausgewertetes Argument / einen ausgewerteten Parameter zurückzugeben (Argument ist Variable ist der Ausdruck, der beim Aufrufen der Funktion angegeben wurde, während Parameter Variable ist, die Teil der Funktionsdeklaration ist).
Auch Funktionen geben immer dasselbe Ergebnis zurück, wenn dieselben Argumente übergeben werden. Auf diese Weise ist es einfacher, Fehler zu vermeiden oder zukünftige Fehler zu beheben. Durch funktionale Programmierung können wir Nebenwirkungen wie das Ändern globaler Variablen vermeiden.
Beispiel in JavaScript:
Das Funktionsinkrement addiert 1 Wert zu jedem Element im Objekt und gibt das Ergebnis zurück. Der Wert von myList hat sich nicht geändert, aber wenn wir die Funktionen aufrufen, sehen wir den Mehrwert für Elemente dieses Objekts.
Wie ist meine Antwort auf Funktionale Programmierung in Java möglich? Ich glaube, dass es nicht möglich ist, echte funktionale Programmierung in Java zu haben. Weil Java wirklich als OOP konzipiert ist, in dem es die imperative Programmierung erweitert und es aus Gründen der Wartbarkeit verbessert. Wenn sich der Zustand eines Objekts, einer Variablen usw. geändert hat, ist dies bereits eine zwingende Programmierung.
quelle