OCAJP 8 – Lambda-Ausdruck/Prädikat

Dieses Tutorial ist ein Vorbereitungsmaterial für die OCAJP-Zertifizierungsprüfung. Dies deckt das Ziel 9.5 in den OCAJP 8-Prüfungsthemen ab (Schreiben Sie einen einfachen Lambda-Ausdruck, der einen Lambda-Prädikatausdruck verwendet). Die Probeprüfungen, die in den echten Prüfungen erscheinen würden, könnten einfacher sein als die Musterprüfungen in diesem Tutorial.

Java ist eine rein objektorientierte Programmierung. Java behandelt alles in Form von Objekten. Aufgrund der Beliebtheit funktionaler Programmierungen wie JavaScript wird Funktionen in der Java-Programmierung nicht die höchste Bedeutung beigemessen. Java 8 macht den ersten Schritt zur Einführung der funktionalen Programmierung mit Lambda-Ausdrücken.

Lambda-Ausdrücke

Einige der wichtigsten Punkte zu den Lambda-Ausdrücken.

  • Es ist nicht erforderlich, den Typ der Parameter zu deklarieren. Der Compiler kann den Typ implizit anhand des Werts der Parameter bestimmen.
  • Es ist nicht erforderlich, für einen einzelnen Parameter Klammern zu verwenden. Wenn wir mehrere Parameter verwenden, sollten diese in Klammern eingeschlossen werden.
  • Wenn der Lambda-Ausdruckskörper eine einzelne Anweisung enthält, müssen die geschweiften Klammern nicht für den Anweisungsblock verwendet werden. Dies ist erforderlich, wenn der Block mehr als eine Anweisung enthält.
  • Lambda-Ausdrücke werden hauptsächlich eingeführt, um die Inline-Implementierung einer funktionalen Schnittstelle zu definieren, dh einer Schnittstelle mit nur einer einzigen abstrakten Methode.
  • Der Lambda-Ausdruck ersetzt die Notwendigkeit einer anonymen Klasse und verleiht der Programmiersprache Java eine sehr einfache und leistungsstarke funktionale Programmierfunktion.

In Java vor der Java 8-Version lautete die Syntax für die Verwendung der anonymen Klasse wie folgt:

package javabeat.net;

public class AnonymousExample {
	public static void main(String[] args) {
		SomeListener listener = new SomeListener() {

			@Override
			public void action() {
				System.out.println("Action Performed");

			}
		};
		listener.action();
	}
}
interface SomeListener {
	void action();
}

Wenn Sie sich den obigen Code ansehen, ist SomeListener eine funktionale Schnittstelle (da sie nur eine abstrakte Methode deklariert) und wird im Beispiel als anonyme Klasse verwendet. Wir müssen die Inline-Implementierung dieser Klasse deklarieren, um die Instanz zu erstellen, die zum Aufrufen der Methoden action() verwendet wird. Der obige Code könnte mit den folgenden Lambda-Ausdrücken vereinfacht werden:

package javabeat.net;
public class AnonymousExample{
public static void main(String[] args) {
		SomeListener listener = () -> System.out.println("Action Performed");
		listener.action();
	}
}

interface SomeListener {
	void action();
}

Der Lambda-Ausdruck besteht aus drei Teilen.

Ocajp-Lambda-Syntax

  • Argumentliste sind die Parameter der Methode. Diese Methode muss mit den Parametern in der Zielfunktionsschnittstelle übereinstimmen. Auch der Typ der Parameter kann weggelassen werden.
  • Pfeil-Token informiert den Compiler darüber, dass es sich bei diesem Ausdruck um eine Lambda-Notation handelt, und analysiert ihn entsprechend.
  • Körper ist die tatsächliche Implementierung der Funktionsmethode. Dies kann entweder ein einzelner Ausdruck, eine einzelne Anweisung ohne geschweifte Klammern oder mehrere Anweisungen mit geschweiften Klammern sein.

Prädikat mit Lambda-Ausdruck

Prädikat ist eine funktionale Schnittstelle, die als Teil der Java 8-Version unter dem Paket eingeführt wurde java.util.function. Im Folgenden sind einige der wichtigsten Punkte zur Predicate-Schnittstelle aufgeführt.

  • Prädikat wird zum Zuweisen eines Lambda-Ausdrucks verwendet.
  • Es handelt sich um eine funktionale Schnittstelle.
  • Die Prädikatschnittstelle definiert 4 Standardmethoden und eine funktionale Methode (abstrakte Methode).
  • Prädikate stellen Einzelargumentfunktionen dar, die einen booleschen Wert zurückgeben.
  • Prädikate können mithilfe von „and“ oder „negieren“ miteinander verkettet werden, um die Daten zu filtern.
  • Vier Methoden in der Predicate-Schnittstelle sind and oder isEqual, negate und test.
  • test(T t) in der Prädikatschnittstelle gibt den booleschen Wert zurück

Hier ist ein einfaches Beispiel, das die Leistungsfähigkeit der Verwendung von Prädikaten mit Lambda-Ausdrücken demonstriert.

package javabeat.net;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class PredicateExample {
	public static void main(String[] args) {
		Child child1 = new Child(3);
		Child child2 = new Child(2);
		Child child3 = new Child(7);
		Child child4 = new Child(10);
		Child child5 = new Child(6);
		Child child6 = new Child(9);
		Child child7 = new Child(8);
		List<Child> childs = Arrays.asList(new Child[] { child1, child2,
				child3, child4, child5, child6, child7 });
		List<Child> filtered = ChildPredicates.filterChilds(childs,
				ChildPredicates.filterByAge(8));
		for (Child child : filtered) {
			System.out.println(child.getAge());
		}
	}
}

class ChildPredicates {
	static Predicate<Child> filterByAge(int x) {
		return a -> a.getAge() > x;
	}

	static List<Child> filterChilds(List<Child> childs,
			Predicate<Child> predicate) {
		return childs.stream().filter(predicate)
				.collect(Collectors.<Child> toList());
	}
}

class Child {
	int age;

	public Child(int age) {
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

Im obigen Beispiel erstellen wir Prädikate zum Filtern des Kindes mit der Bedingung „Alter“. Wenn wir nicht über die Funktion des Prädikats und des Lambda verfügen, müssen wir möglicherweise die Logik zum Überprüfen jeder Bedingung und eine Methode schreiben. Außerdem stellt die Stream-API die Methode filter() bereit, die das Prädikat als Argument verwendet und den Lambda-Ausdruck auswertet.

Beispiel-Scheinprüfung für Lambda-Ausdrücke und Prädikat

1. Was wird das Ergebnis des folgenden Programms sein?

package javabeat.net;

public class LambdaMock1 {
	static final int k = 20;
	interface Inter{
		int method(int x);
	}
	public static void main(String[] args) {
		Inter inter =  (x) -> k + 10;
		System.out.println(inter.method(20));
	}
}

Antworten sind:

  • Compilerfehler
  • 30
  • Wenn Sie das Schlüsselwort final für die Variable k entfernen, lässt sich das Programm problemlos kompilieren
  • Nichts des oben Genannten
  • Richtige Antwort: 30

    Erläuterung:

  • Auf die endgültige Variable kann innerhalb eines Lambda-Ausdrucks zugegriffen werden
  • Im obigen Programm liegt kein Fehler in der Lambda-Syntax vor
  • 2. Welche der folgenden Syntaxen sind für Lambda-Ausdrücke gültig?

  • () -> System.out.println(“Lambda”);
  • () -> {System.out.println(“Lambda”);};
  • () <- System.out.println();
  • () <- {System.out.println();};
  • Richtige Antwort: 1,2

    Erläuterung: Die korrekte Notation für den Lambda-Ausdruck ist ->. 1 und 2 verwenden die korrekte Schreibweise mit geschweiften Klammern und ohne geschweifte Klammern.

    3. Das Schlüsselwort „return“ im Lambda-Ausdruck ist optional, wenn der Körper einen einzelnen Ausdruck zur Rückgabe des Werts hat. Geben Sie an, ob die obigen Aussagen wahr sind.

  • WAHR
  • FALSCH
  • Richtige Antwort: 1

    Erläuterung: Der Compiler gibt automatisch einen Wert zurück, wenn der Körper einen einzelnen Ausdruck zur Rückgabe des Werts hat. Geschweifte Klammern sind erforderlich, um anzuzeigen, dass der Ausdruck einen Wert zurückgibt.

    4. Prädikat ist keine funktionale Schnittstelle. Ist die obige Aussage wahr/falsch?

  • WAHR
  • FALSCH
  • Richtige Antwort: 2. Falsch

    Erläuterung: Prädikat ist eine funktionale Schnittstelle

    5. Stellen Sie fest, dass die folgende Anweisung in der Syntax korrekt ist. Gehen Sie davon aus, dass s nirgendwo im Programm deklariert ist.
    Prädikat predicate = (s)->s.equals(“string“);

  • Falsch. Es wird ein Compiler-Fehler auftreten (s ist nicht deklariert)
  • Die obige Anweisung würde ohne Fehler kompiliert und ausgeführt werden.
  • Richtige Antwort: 2

    Erläuterung: Die obige Anweisung würde ohne Fehler kompiliert und ausgeführt werden. Es handelt sich um einen Lambda-Ausdruck und wir müssen die Variable s nicht deklarieren, da sie in Lambda-Ausdrücken verwendet wird.

    6. Was ist der Rückgabetyp der Methode test(T t) in der Predicate-Funktionsschnittstelle?

  • verkohlen
  • Boolescher Wert
  • Zeichenfolge
  • int
  • Richtige Antwort: 2

    Erläuterung: test(T t) ist eine abstrakte Methode in der Predicate-Schnittstelle und gibt den booleschen Typ zurück.

    7. Was wird die Ausgabe für das folgende Programm sein:

    package javabeat.net;
    
    import java.util.function.Predicate;
    
    public class PredicateExample {
    	public static void main(String[] args) {
    		Predicate<Integer> greaterThanTen = (var) -> var > 10;
    		System.out.println(greaterThanTen.test(10));
    	}
    }
    
  • WAHR
  • FALSCH
  • Compilerfehler
  • Laufzeitausnahme
  • Richtige Antwort: falsch

    Erläuterung: Dieses Programm führt den Lambda-Ausdruck ordnungsgemäß durch und wertet ihn aus, um zu prüfen, ob er für den als Argument übergebenen Wert größer als 10 ist.

    Kommentar verfassen

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

    Nach oben scrollen