JDK8の新機能の詳細な紹介

王林
リリース: 2019-11-26 13:45:05
転載
2942 人が閲覧しました

JDK8の新機能の詳細な紹介

関数型プログラミング

オブジェクト指向は、「すべてがオブジェクトである」ということを強調します。何かをしたい場合は、オブジェクトを見つける必要があります。でやります。関数型プログラミングの考え方では、「方法」ではなく「何を行うか」に重点が置かれます。

通常のオープニング スレッド

// 匿名内部类对象
Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("乌鸦坐飞机");
    }
};
new Thread(task).start();
ログイン後にコピー

その他の Java 関連の無料ビデオ チュートリアル: Java オンライン チュートリアル

関数を開く

new Thread(() -> System.out.println("龙卷风摧毁停车场")).start();
ログイン後にコピー

のようなプログラミングを使用したスレッド その前の括弧: メソッドのパラメータ。パラメータがない場合は、()と書きます。矢印は後で何を行うかを指します。矢印の後ろは次のようになりますメソッド本体の中括弧。特定の実行内容を表します。

ラムダ式

クロージャとも呼ばれるラムダ式は、Java 8 のリリースを推進する最も重要な新機能です。

Lambda では、関数をメソッドのパラメーターとして使用できます (関数はパラメーターとしてメソッドに渡されます)。ラムダ式を使用すると、コードをより簡潔でコンパクトにすることができます。

3 つの要素: パラメーター、矢印、コード

形式: (パラメーター タイプ パラメーター名) -> {コード}

ラムダ式を使用する式の前提: インターフェイスが存在する必要があり、インターフェイスには抽象メソッドが 1 つだけあります。

デモ: Cook インターフェイスを作成します。インターフェイスには makeFood() メソッドがあります。

public static void main(String[] args) {
    method(() -> {
        System.out.println("闪刀启动!");
    });
}
 
private static void method(Cook cook) {
    cook.makeFood();
}
ログイン後にコピー

ラムダ式 数式省略規則:

パラメータの型は省略可能です。ただし、すべてのパラメータの型を同時に省略するか、まったく省略できないことのみ可能です。パラメータが 1 つだけある場合、括弧は省略できます。中括弧内のステートメントが 1 つだけの場合、戻り値の有無に関係なく、return、括弧、セミコロンは省略できます。

    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);
    }
ログイン後にコピー

新しいインターフェイスの場合、匿名内部クラスの代わりにラムダ式を使用することもできます

Runnable task = () -> System.out.println("闪刀启动!");
new Thread(task).start();
ログイン後にコピー

関数型インターフェイス

インターフェイスには と があります関数インターフェイスと呼ばれる抽象メソッドは 1 つだけです。

アノテーション @FunctionalInterface が JDK8 に追加されました。これは、インターフェイスが機能インターフェイスであるかどうかを検出するために使用されます。機能的なインターフェイスではない場合、コンパイル中にエラーが報告されます。 @FunctionalInerface アノテーションはオプションであり、このアノテーションを使用しない場合でも、関数型インターフェースの定義要件を満たしている限り、それは関数型インターフェースです。

@FunctionalInterface
public interface MyInterface {
    void method();
}
ログイン後にコピー

メソッドリファレンス

Printer printer = (str) -> System.out.println(str);このコードは実際には次のようになります。略称。

推論可能な限り参照可能であるため、パラメータを渡すことは実際には無意味であるため、ここでは実際にメソッド参照を使用して System.out::println

# を省略できます。 ## java8 から新しい演算子が導入され、メソッド参照演算子 (2 つのコロンが連続して記述されます)、式はメソッド参照です、メソッド参照と Lambda の本質はまったく同じです、目的は Lambda 式スタイルを簡素化することです書くことの。

Lambdaの書き方:

s->System.out.println(s)

メソッドリファレンスの書き方:

System.out::println

2 つの書き込みメソッドは完全に同等です

 
    public static void main(String[] args) {
        method(System.out::println);
    }
 
    private static void method(Printer printer) {
        printer.print("hello");
    }
ログイン後にコピー

インターフェイス

デフォルト メソッド

元々は 2 つの抽象メソッドだったインターフェイスを 3 つの抽象メソッドに変更する必要があり、その実装クラスも新しいメソッドを実装する必要があります。

実装クラスが多すぎると操作が非常に面倒になる JDK では、拡張にはオープン、修正にはクローズというオープンクローズ設計モードを使用していました。つまり、新しいインターフェイスを作成し、元のインターフェイスを継承し、新しいメソッドを定義します。ただし、この場合、元の実装クラスには新しいメソッドがありません。この時点では、インターフェイスのデフォルトのメソッドが使用できます。

キーワードはデフォルトで変更され、メソッドにはメソッド本体が必要です。このようなメソッドのすべてのサブクラスはデフォルトで実装されます (自分で記述する必要はありません)。これをオーバーライドしたい場合は、実装クラス

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

Note でオーバーライドすることもできます。 : インターフェイスのデフォルト メソッドは同等です。 したがって、新しいキーワードと 4 つの修飾子の「デフォルト」は同じ概念ではありません。

default キーワードを使用すると、プログラムで「多重継承」の効果を実現できます。

静的メソッド

java8 からはインターフェース内で静的メソッドを定義できるようになり、使い方は一般クラスの静的メソッドと同じになります。

public interface Animal {
 
    void eat();
 
    static Animal getAnimal() {
        return new Cat();
    }
}
ログイン後にコピー

ストリーミング操作

ストリーミング処理が開発者に与える第一印象は、コレクション操作がはるかに簡単になるということです。通常、これを完了するには複数行のコードが必要です。ストリーミング処理を利用することで、操作を 1 行で実装できます。

たとえば、整数を含むコレクションからすべての偶数をフィルターで除外し、それらを新しい List にカプセル化して返したい場合、Java8 より前では、次のコードを実装する必要があります。

数値のコレクションの場合:

List<Integer> evens = new ArrayList<>();
for (final Integer num : nums) {
    if (num % 2 == 0) {
        evens.add(num);
    }
}
ログイン後にコピー

Java8 のストリーミング処理により、コードを次のように簡略化できます:

List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
ログイン後にコピー

上記のステートメント行、stream() 操作の意味を簡単に説明します。コレクションをストリームに変換し、filter() でカスタム フィルタリング プロセスを実行します。ここでは、ラムダ式ですべての偶数をフィルタリングし、最後に、collect() で結果をカプセル化し、Collectors.toList() で指定します。 List コレクションにカプセル化されます。そして戻ってきました。

常用操作案例:

        //初始化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零基础入门

欢迎大家一起来学习!

以上がJDK8の新機能の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!