Heim  >  Artikel  >  Java  >  Detaillierte Einführung in neue Funktionen von JDK8

Detaillierte Einführung in neue Funktionen von JDK8

王林
王林nach vorne
2019-11-26 13:45:052940Durchsuche

Detaillierte Einführung in neue Funktionen von JDK8

Funktionale Programmierung

Objektorientiert betont, dass „alles ein Objekt ist“, wenn man etwas tun möchte damit man es machen kann. Beim funktionalen Programmierdenken geht es eher darum, „was zu tun ist“ als darum, „wie es zu tun ist“.

Gewöhnlicher Eröffnungsthread

// 匿名内部类对象
Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("乌鸦坐飞机");
    }
};
new Thread(task).start();

Weitere kostenlose Java-Video-Tutorials: Java-Online-Tutorial

Funktion Öffnen Sie a Thread mit Programmierung

rrree

Die Klammern davor: Methodenparameter Wenn keine Parameter vorhanden sind, zeigt der Pfeil an, was später getan werden soll Körperstütze, die das spezifische Was zu tun darstellt.

Lambda-Ausdruck

Der Lambda-Ausdruck, auch als Abschluss bekannt, ist die wichtigste neue Funktion, die die Veröffentlichung von Java 8 vorantreibt.

Lambda ermöglicht die Übergabe von Funktionen als Parameter einer Methode (Funktionen werden als Parameter an Methoden übergeben). Die Verwendung von Lambda-Ausdrücken kann den Code prägnanter und kompakter machen.

Drei Elemente: Parameter, Pfeile, Code

Format: (Parametertyp-Parametername) -> Lambda-Ausdruck verwenden Die Prämisse der Formel: Es muss eine Schnittstelle geben und es darf nur eine abstrakte Methode in der Schnittstelle geben

Demonstration: Schreiben Sie eine Cook-Schnittstelle, und es gibt eine makeFood()-Methode in der Schnittstelle

new Thread(() -> System.out.println("龙卷风摧毁停车场")).start();

Lambda-Ausdruck Formel-Auslassungsregeln:

Der Parametertyp kann weggelassen werden. Sie können jedoch nur die Typen aller Parameter gleichzeitig weglassen oder sie überhaupt nicht weglassen. Wenn es einen und nur einen Parameter gibt, können die Klammern weggelassen werden. Wenn es eine und nur eine Anweisung in den geschweiften Klammern gibt. Unabhängig davon, ob ein Rückgabewert vorhanden ist, können Rückgabe, geschweifte Klammern und Semikolons weggelassen werden.

public static void main(String[] args) {
    method(() -> {
        System.out.println("闪刀启动!");
    });
}
 
private static void method(Cook cook) {
    cook.makeFood();
}

Wenn eine Schnittstelle neu ist, können Sie auch Lambda-Ausdrücke anstelle anonymer innerer Klassen verwenden

    public static void main(String[] args) {
        method((a, b)-> a + b);
    }
 
    private static void method(Calculator calculator) {
        int result = calculator.sum(1234, 9876);
        System.out.println(result);
    }

Funktionale Schnittstelle

Die Schnittstelle hat und Es gibt nur eine abstrakte Methode, eine sogenannte funktionale Schnittstelle.

Es gibt eine neue Annotation

in JDK8, die verwendet wird, um zu erkennen, ob eine Schnittstelle eine funktionale Schnittstelle ist. Handelt es sich nicht um eine funktionsfähige Schnittstelle, wird beim Kompilieren ein Fehler gemeldet. Die Annotation @FunctionalInerface ist optional, auch wenn diese Annotation nicht verwendet wird, solange die Schnittstelle die Definitionsanforderungen einer funktionalen Schnittstelle erfüllt.

Runnable task = () -> System.out.println("闪刀启动!");
new Thread(task).start();
@FunctionalInterface

Methodenreferenz

Dieser Code kann tatsächlich abgekürzt werden.

Printer printer = (str) -> System.out.println(str);Solange es ableitbar ist, ist es referenzierbar, sodass die Übergabe von Parametern eigentlich keinen Sinn ergibt. Hier können Sie also tatsächlich Methodenreferenzen zum Abkürzen verwenden

System.out::printlnAb Java8, a Der Ausdruck im neuen Operator, der Methodenreferenzoperator (zwei nacheinander geschriebene Doppelpunkte), ist eine Methodenreferenz und Lambda. Das Wesentliche von Methodenreferenz und Lambda ist genau das Gleiche, und der Zweck besteht darin, das Schreiben von Lambda-Ausdrücken zu vereinfachen.

Lambda-Schreibmethode:

s->System.out.println(s)Methodenreferenz-Schreibmethode:

System.out::printlnDie beiden Schreibmethoden sind völlig gleichwertig

@FunctionalInterface
public interface MyInterface {
    void method();
}

Schnittstelle

Standardmethode

Die Schnittstelle hatte ursprünglich zwei abstrakte Methoden, muss aber jetzt in drei abstrakte Methoden umgewandelt werden Die Klasse muss auch eine neue Methode implementieren.

Wenn zu viele Implementierungsklassen vorhanden sind, ist die Bedienung sehr problematisch. Das JDK verwendete früher den Open-Close-Designmodus: offen für Erweiterungen und geschlossen für Änderungen. Das heißt: Erstellen Sie eine neue Schnittstelle, erben Sie die ursprüngliche Schnittstelle und definieren Sie neue Methoden. In diesem Fall verfügen die ursprünglichen Implementierungsklassen jedoch nicht über neue Methoden. Zu diesem Zeitpunkt kann die Standardmethode der Schnittstelle verwendet werden.

Das Schlüsselwort wird standardmäßig geändert und die Methode erfordert einen Methodenkörper. Alle Unterklassen einer solchen Methode werden standardmäßig implementiert (Sie müssen sie nicht selbst schreiben, Sie können sie auch in der Implementierungsklasse überschreiben

 
    public static void main(String[] args) {
        method(System.out::println);
    }
 
    private static void method(Printer printer) {
        printer.print("hello");
    }

Hinweis). : Die Standardmethode in der Schnittstelle ist äquivalent. Ein neues Schlüsselwort und der „Standard“ der vier Modifikatoren sind also nicht dasselbe Konzept.

Durch die Verwendung des Standardschlüsselworts kann das Programm den Effekt einer „Mehrfachvererbung“ erzielen.

statische Methode

Ab Java8 dürfen statische Methoden in Schnittstellen definiert werden, und ihre Verwendung ist die gleiche wie statische Methoden allgemeiner Klassen.

/**
 * 从java8开始,接口当中允许定义default默认方法
 * 修饰符:public default(public可以省略,default不能省略)
 */
public interface MyInterface {
 
    void method1();
 
    void method2();
 
    default void methodNew() {
        System.out.println("接口默认方法执行");
    }
 
}

Streaming-Vorgang

Der erste Eindruck, den die Streaming-Verarbeitung vermittelt, ist, dass sie den Erfassungsvorgang erheblich vereinfacht Der Vorgang kann mit Hilfe der Streaming-Verarbeitung in einer Zeile implementiert werden.

Wenn wir beispielsweise alle geraden Zahlen aus einer Sammlung mit Ganzzahlen herausfiltern und sie zur Rückgabe in eine neue Liste einkapseln möchten, müssen wir dies vor Java8 durch den folgenden Code implementieren:

Für eine Sammlung von Nums:

public interface Animal {
 
    void eat();
 
    static Animal getAnimal() {
        return new Cat();
    }
}

Durch die Streaming-Verarbeitung von Java8 können wir den Code wie folgt vereinfachen:

List<Integer> evens = new ArrayList<>();
for (final Integer num : nums) {
    if (num % 2 == 0) {
        evens.add(num);
    }
}

Lassen Sie uns kurz die Bedeutung der obigen Anweisungszeile stream() erklären Operation Wandeln Sie die Sammlung in einen Stream um, filter() führt unseren benutzerdefinierten Filterprozess aus, hier filtern wir alle geraden Zahlen durch Lambda-Ausdrücke heraus, und schließlich kapseln wir die Ergebnisse durch Collect() und spezifizieren sie durch Collectors.toList() Eingekapselt in a Listenabholung und Rückgabe.

常用操作案例:

        //初始化list集合
        List<String> list = new ArrayList<String>();
        list.add("测试数据1");
        list.add("测试数据2");
        list.add("测试数据3");
        list.add("测试数据12");
        
        //使用λ表达式遍历集合
        list.forEach(s -> System.out.println(s));
        
        //结合Predicate使用和过滤条件筛选元素
        Predicate<String> contain1 = n -> n.contains("1");
        Predicate<String> contain2 = n -> n.contains("2");
        
        //根据条件遍历集合
        list.stream().filter(contain1).forEach(n -> System.out.println(n));
        list.stream().filter(s -> contain1.test(s)).forEach(s -> System.out.println(s));
        list.stream().filter(contain1.and(contain2)).forEach(n -> System.out.println(n));
        list.stream().filter(contain1.or(contain2)).forEach(n -> System.out.println(n));
        
        //将过滤后的元素重新放到一个集合中
        List<String> newList = list.stream().filter(contain1.and(contain2)).collect(Collectors.toList());
        
集合中decimal求和
		BigDecimal sum = list
				.stream()
				.map(Person::getAmount)
				.reduce(BigDecimal::add)
				.get();
 
//排序 , 也需要新的集合接收
	List<Student> resultList = new ArrayList<Student>();
	resultList = list.stream().sorted(Comparator.comparing(Student::getAge)).collect(Collectors.toList())

推荐java相关文章:java零基础入门

欢迎大家一起来学习!

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in neue Funktionen von JDK8. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen