Heim  >  Artikel  >  Java  >  Beispiele für funktionale Programmierung in Java8

Beispiele für funktionale Programmierung in Java8

黄舟
黄舟Original
2017-08-09 14:03:282000Durchsuche

Funktionale Programmierung, dieses Wort besteht aus zwei Substantiven, Funktion und Programmierung. Ich muss das Wort Programmieren nicht erklären, jeder macht es. In der Tat ist die Funktion nicht unbekannt, wenn man sie vom Wort trennt. Der folgende Artikel führt Sie hauptsächlich in die relevanten Informationen zur Java8-Funktionsprogrammierung ein.

Vorwort

In einem früheren Artikel haben wir schnell Lambda und Stream gelernt, in diesem Kapitel überprüfen und verstehen wir funktionale Ausdrücke und Programmierideen. Wir erwähnen immer wieder den Begriff „funktional“. Bezieht er sich auf Lambda? Wenn ja, welche Vorteile können Sie aus der Einführung funktionaler Programmierung ziehen?

Funktionales Denken

Imperative Programmierung

Im Allgemeinen haben wir zwei Möglichkeiten, ein System zu implementieren. Die eine konzentriert sich auf die Implementierung, z. B. das Kochen. Normalerweise folgen Sie der Kochmethode, mit der Sie vertraut sind: Zuerst das Gemüse waschen und dann das Gemüse schneiden , Öl erhitzen, servieren und dann ... Das sieht aus wie eine Reihe von Bestellungen. Wir nennen diesen „How to do“-Programmierstil imperative Programmierung. Seine Eigenschaften sind dem Fließband einer Fabrik und der Befehlsverarbeitung eines Computers sehr ähnlich, die beide serialisiert und imperativ sind.


CookingTask cookingTask = new CookingTask();
cookingTask.wash();
cookingTask.cut();
cookingTask.deepFry();
cookingTask.fried();
...

Deklarative Programmierung

Es gibt noch eine andere Möglichkeit, was zu tun ist, wenn wir Lambda und funktionale Ausdrücke verwenden, um die oben genannten Probleme zu lösen Es sollte so aussehen:


public class CookingDemo {
 public void doTask(String material, Consumer<String> consumer) {
  consumer.accept(material);
 }
 public static void main(String[] args) {
  CookingDemo cookingDemo = new CookingDemo();
  cookingDemo.doTask("蔬菜", material -> System.out.println("清洗" + material));
  cookingDemo.doTask("蔬菜", material -> System.out.println(material + "切片"));
  cookingDemo.doTask("食用油", material -> System.out.println(material + "烧热"));
  cookingDemo.doTask("", material -> System.out.println("炒菜"));
 }
}

Hier überlassen wir die Implementierungsdetails des Kochens der Funktionsbibliothek. Sein größter Vorteil ist, dass es sich wie eine Problemstellung liest. Mit dieser Methode können wir ihre Funktion schnell verstehen. Wenn Sie weitere Schritte im Kochprozess hinzufügen, müssen Sie nur die doTask-Methode aufrufen, um beispielsweise das Speiseöl zu verarbeiten , ich muss ein Ei aufschlagen


cookingDemo.doTask("鸡蛋", material -> System.out.println(material + "打碎搅拌均匀"));

, anstatt eine Methode zum Umgang mit dem Ei zu schreiben.

Was ist funktionale Programmierung?

Die einfachste Antwort auf die Frage „Was ist funktionale Programmierung?“ lautet: „Es ist eine Art der Programmierung mit.“ Funktionen.“ Das Verständnis jedes Einzelnen ist unterschiedlich, aber der Kern besteht darin, unveränderliche Werte und Funktionen zu verwenden, um einen Wert zu verarbeiten und ihn einem anderen Wert zuzuordnen.

Verschiedene Sprachgemeinschaften bewundern oft ausschließlich die Besonderheiten ihrer jeweiligen Sprachen. Es ist noch zu früh, darüber zu sprechen, wie Java-Programmierer funktionale Programmierung definieren, aber das spielt überhaupt keine Rolle! Es geht uns darum, guten Code zu schreiben, nicht Code, der einem funktionalen Programmierstil entspricht.

Stellen wir uns vor, wir entwerfen eine Funktion, die Parameter vom Typ „String“ und „Boolean“ eingibt und einen ganzzahligen Parameter ausgibt.


int pos = 0;
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  pos++;
 }
 return pos;
}

Dieses Beispiel hat Eingabe und Ausgabe. Gleichzeitig kann jeder Aufruf auch den Wert externer Variablen aktualisieren. Wir nennen eine solche Funktion einen Nebeneffekt. Funktion.

Im Kontext der funktionalen Programmierung entspricht eine „Funktion“ einer mathematischen Funktion: Sie akzeptiert null oder mehr Argumente, erzeugt ein oder mehrere Ergebnisse und hat keine Nebenwirkungen. Man kann es sich als eine Blackbox vorstellen, die Eingaben aufnimmt und Ausgaben erzeugt, wie die folgende Funktion. Die Unterscheidung zwischen den in der Sprache vorkommenden Funktionen ist sehr wichtig (wir können uns nicht vorstellen, dass mathematische Funktionen wie log oder sin Nebenwirkungen haben). Insbesondere wenn eine mathematische Funktion mit denselben Parametern aufgerufen wird, muss das zurückgegebene Ergebnis dasselbe sein. Hier werden wir Methoden wie Random.nextInt vorerst nicht berücksichtigen,


Nebenwirkungen von Funktionen
public Integer foo(String str, boolea flag){
 if(flag && null != str){
  return 1;
 }
 return 0;
}

Wenn wir von „funktional“ sprechen, müssen wir Was eigentlich gesagt wird, ist „wie eine mathematische Funktion – keine Nebenwirkungen“. Daraus ergeben sich einige subtile Probleme bei der Programmierung. Meinen wir damit, dass jede Funktion nur mithilfe von Funktionen und mathematischen Ideen wie „Wenn-Dann-Sonst“ erstellt werden kann? Oder erlauben wir auch die Ausführung einiger nichtfunktionaler Operationen innerhalb von Funktionen, solange die Ergebnisse dieser Operationen nicht anderen Teilen des Systems zugänglich gemacht werden? Mit anderen Worten: Wenn das Programm bestimmte Nebenwirkungen hat, diese Nebenwirkungen jedoch von anderen Aufrufern nicht wahrgenommen werden, können wir dann davon ausgehen, dass diese Nebenwirkungen nicht vorhanden sind? Der Anrufer muss nichts von diesen Nebenwirkungen wissen oder sich darum kümmern, da sie keinerlei Auswirkungen darauf haben. Wenn wir den Unterschied zwischen den beiden definieren möchten, nennen wir die erste rein funktionale Programmierung und die letztere funktionale Programmierung.

In der tatsächlichen Programmierung ist es für uns schwierig, die Java-Sprache zu verwenden, um ein Programm auf rein funktionale Weise zu vervollständigen, da viele alte Codes, einschließlich Standardbibliotheksfunktionen, Nebenwirkungen haben (der Aufruf von Scanner.nextLine hat Nebenwirkungen, das wird es auch). Lesen Sie eine Zeile aus einer Datei. Normalerweise sind die Ergebnisse zweier Aufrufe völlig unterschiedlich. Sie möchten eine nahezu rein funktionale Implementierung Ihres Systems schreiben und müssen sicherstellen, dass Ihr Code keine Nebenwirkungen hat. Gehen Sie davon aus, dass eine solche Funktion oder Methode keine Nebenwirkungen hat. Beim Betreten des Methodenkörpers zur Ausführung wird der Wert eines Felds um eins erhöht, und vor dem Verlassen des Methodenkörpers wird der Wert des Felds um eins verringert. Für ein Single-Thread-Programm hat diese Methode keine Nebenwirkungen und kann als funktionale Implementierung betrachtet werden.

Unsere Richtlinie für die Konstruktion funktionaler Stile ist, dass Funktionen oder Methoden, die als „funktionaler Stil“ bezeichnet werden, nur lokale Variablen ändern können. Darüber hinaus sollten die Objekte, auf die sie sich beziehen, endgültig sein. Alle Referenztypfelder verweisen auf unveränderliche Objekte.

Zusammenfassung

Das obige ist der detaillierte Inhalt vonBeispiele für funktionale Programmierung in Java8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn