JDK8新機能3--関数インタフェース

方法1 JDK8二つの新しいインターフェイス

jdk8インターフェイスの前に

interface 接口名 {
    静态常量;
    抽象方法
}

JDK8インターフェイスを強化するために、インターフェイスは、デフォルトメソッドと静的メソッドを持つことができます

JDK8インタフェース:

interface {
    静态常量;
    抽象方法;
    默认方法;
    静态方法;
}

1.1インタフェースのデフォルトの方法

1.1.1定義フォーマット

interface 接口名{
    修饰符 default 返回值类型 方法名(){
        body
    }
}

1.1.2使用

一つの方法:クラスのデフォルトのメソッドの呼び出しインタフェース実装していることを直接

第二の方法:あなたは、デフォルトの実装クラスのインターフェイスメソッドをオーバーライドすることがあり

例えば:A、B、C、B、及びCは、Aに実装された3つのインターフェイスを定義

package com.hm.lambda;

public interface AA {
    public default void test01(){
        System.out.println("接口AA的默认方法");
    }
}



package com.hm.lambda;

// 实现类可以直接使用AA的默认方法
public class BB implements AA{
}


package com.hm.lambda;

// 实现类可以重写AA的默认方法
public class CC implements AA {
    @Override
    public void test01() {
        System.out.println("我是CC重写的方法");
    }
}

そして、この方法はそれぞれCCやBBを呼び出します

 public static void main(String[] args) {
        BB bb = new BB();
        bb.test01();
        CC cc = new CC();
        cc.test01();
    }

図に示す実行結果:

1.2インターフェイスの静的メソッド

拡張を容易にするために、JDK8インターフェースは、静的メソッドを追加しました

1.2.1定義フォーマット

interface 接口名 {
    修饰符 static 返回值类型 方法名(){
        代码;
    }
}

1.2.2使用

直接インターフェイス名を使用します。への静的メソッド呼び出しを

例えば:

package com.hm.lambda;

public interface AA {
    public default void test01(){
        System.out.println("接口AA的默认方法");
    }

    public static void test02(){
        System.out.println("静态方法test02");
    }
}

コール:

 public static void main(String[] args) {
        AA.test02();
    }

注:インターフェースの静的メソッドを継承することができない、書き換えることができません

1.2.3インタフェースの違いのデフォルトのメソッドと静的メソッド

1)デフォルトのメソッドインスタンス呼び出し、インターフェース名を介して静的メソッド呼び出し

2)デフォルトメソッドは継承することができる、デフォルトの実装クラスがインターフェイス直接法を使用することができ、この方法は、デフォルトをオーバーライドすることができます

静的メソッドは継承できません3)、インターフェースの実装クラスは、静的メソッドをオーバーライドすることはできません、あなただけのインタフェース名の通話を使用することができます

概要:静的メソッドの定義、デフォルトのメソッドを定義しますか?ときにこのメソッドを使用すると、デフォルトのメソッドを使用するときに継承または上書きする必要があり、そうでない場合は、静的メソッドを使用します。

関数インタフェースを認識する2

        機能インターフェース(FunctionalImplement)が抽象メソッド宣言にのみインタフェースを含有するが、界面の非抽象メソッドを複数有していてもよいです。等、のようなJavaインタフェースタイプに同様に標識されたマーカーインタフェースは、インタフェースのインスタンスの特定のインスタンスかどうかを検出することができるinstanceofを介して主に直接ため、java.io.Serializableのインタフェースメソッド宣言または属性宣言はありません。

        インターフェイスは、抽象メソッドを持つことができるインターフェースは、インターフェースのこのタイプはまた、SAMインタフェースと呼ばれるインタフェース機能です。

@FunctionalInterface
public interface LamFilter {
    Boolean filter(Apple apple);
}

         Javaの8は関数インタフェースは、新しいコメント@FunctionalInterface、主にあなたが機能インタフェースの定義を満たしていないインタフェースを記述する場合、コンパイラは文句を言うだろう、コメントで、エラーチェックコンパイラレベルで使用を紹介しています。プラス@FunctionalInterfaceなしインターフェイスの機能には影響はノートがちょうどインタフェースのみ抽象メソッドが含まれているかどうかを確認するようにコンパイラに思い出させるために、インタフェースではありません。図示のように、@FunctionalInterfaceインターフェイスで宣言した注釈は、インターフェース定義関数インタフェースです。

インターフェースの2.1機能特性

この方法は、デフォルトを定義することができます2.1.1

デフォルトの方法は、クラスを実装することで、直接と呼ばれるデフォルトの実装は、そこにある、抽象的ではないが、クラスが向上し、スケーラビリティを実現するために、このメソッドを実装する必要はありません!

@FunctionalInterface
interface HelloWorld {
    void print(String str);
    //默认方法
    default void print2(String message) {
       System.out.println(message);
    }
}

注:デフォルト(デフォルト)メソッドは、唯一のインタフェースの実装クラスを経由して呼び出すことができるが、それはインタフェースの実装クラスを継承するか、デフォルトのメソッドをオーバーライドすることができ、実装を必要としません。  

2.1.2は、静的メソッドの定義を可能に

静的メソッドは、メソッドが実装された、ダイレクトインターフェース呼び出し抽象メソッドにすることはできません。通常の静的メソッドが同じであると、それは呼び出しに実装クラスを必要としません。

@FunctionalInterface
interface HelloWorld {
    void print(String str);
    //静态方法
    static void print3(String message) {
        System.out.println(message);
    }
}

注:静的(スタティック)メソッドは、唯一のインタフェース名で呼び出すことができ、それは、クラスが呼び出される実装するクラスまたはオブジェクトのクラス名によって達成することができません。ただ、通常の静的クラスメソッド、クラスのような場所を直接呼び出したメソッド 

2.1.3。java.lang.Objectのは、公共の方法で定義することができます

        インタフェース機能のためのこれらの方法は、それが(それらが抽象メソッドであるが)抽象メソッドとして扱われず、任意のインタフェースで実現される機能として、デフォルトはjava.lang.Object上位のものを含む、オブジェクトクラスを継承しました抽象メソッドを実装します。

2.1.4は、複数のサブインターフェイスを継承親インターフェイスを可能に

        インタフェースの継承の複数のサブ親インターフェイスを可能にするが、抽象インタフェース・メソッドは、それぞれの親のために存在することができ、そして同じ抽象メソッドでなければなりません

注:関数インタフェース、および抽象メソッド、パブリックメソッドを除くオブジェクト。

3.カスタム関数インタフェース

カスタム関数のパラメータの3.1数のインターフェイス        

我々はそれを行う方法の3つのパラメータを持っている場合には、BiFunction JDKは、2つのパラメータのみの最大を提供していましたか?我々はそれを達成するために、カスタム・インタフェース機能を使用する必要があります。この時間!

例えば:

Orage.java

package com.bjc.demo1;

public class Orage {
    private  String color;
    private Double price;
    private Double weight;
    
    public Orage(String color, Double price, Double weight) {
        this.color = color;
        this.price = price;
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Double getWeight() {
        return weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }
}

 ThreeFunctionインタフェースカスタム機能:

package com.bjc.lambda.demo1;

@FunctionalInterface
public interface ThreeFunction<T,U,V,R> {
    R apply(T t,U u,V v);
}

使用したインタフェース機能:

ThreeFunction<String,Double,Double,Orage> tFunc = Orage :: new;
Orage orage = tFunc.apply("red", 3.99, 0.78);
System.out.println(orage);

3.2カスタムパラメータなしの関数インタフェース

インタフェースの定義:

interface InterfaceExample{
	Example create(String name);
}

使用します。

public static void main(String[] args) {
	InterfaceExample com =  Example::new;
	Example bean = com.create("hello world");
	System.out.println(bean.name);
}

注:例では、クラスのPOJOであります

公開された205元の記事 ウォンの賞賛9 ビュー7920

おすすめ

転載: blog.csdn.net/weixin_43318134/article/details/104426168