JDK8.0関連機能
1.JDK8.0の新しいインターフェース構文
-
JDK8.0、静的メソッドは、メソッドの実装部分を使用して、インターフェースで定義できます。
- 構文:public static return value type method name(parameter list){//実装部分}
-
JDK8.0、デフォルトの実装を持つ非抽象メソッドをインターフェースで定義できます
- 構文:public default return value type method name(parameter list){//メソッドの実装}
次に、ラムダ式の関連する構文
-
ラムダ式はインターフェースを実装し、オブジェクトを作成します(匿名内部クラスの単純化された記述)
-
ラムダ式は、Java言語で新しい構文要素と記号を導入します:「->」。この演算子はラムダ演算子または矢印演算子と呼ばれ、この演算子はラムダ式を2つの部分に分割します。
- 左:ラムダ式に必要なパラメーターを指定します
- 右:Lambda式の実行関数部分を指定します
-
構文形式1:パラメーターなし、戻り値なし
インターフェイス名参照名=()-> {//実行関数部分};
場合:
public class Test { public static void main(String[] args) { IA ia = ()->{ System.out.println("m1方法...."); }; ia.m1(); } } interface IA{ void m1(); }
注意:
- Lambda式で実装されたインターフェースでは、インターフェースで定義する必要がある抽象メソッドは1つだけです。
- Lambda式の実装本体にステートメントが1つしかない場合は、{}を省略できますが、お勧めしません。
-
構文2:パラメーターあり、戻り値なし
インターフェイス名参照=(データ型変数名)-> {//実装本体...};
ケース1:パラメータ
public class Test { public static void main(String[] args) { IA ia = (int n)->{ if(n%2==0){ System.out.println(n+"是偶数...."); }else{ System.out.println(n+"是奇数...."); } }; ia.m1(6); } } interface IA{ void m1(int n); }
ケース2:複数のパラメーター
public class Test { public static void main(String[] args) { IA ia = (int a,double b)-> { System.out.println("a="+a+",b="+b); }; ia.m1(3,9.8); } } interface IA{ void m1(int n,double d); }
注:コンパイラーは型推論を実行できるため、Lambda式のデータ型は省略できます。
-
構文3:戻り値あり
インターフェイス名参照名=(パラメータリスト)-> {returnステートメント;}
public class Test { public static void main(String[] args) { IA ia = (a)->{ if(a<5){ a=a+1; } return a; }; int r=ia.m1(3); System.out.println("r="+r); } } interface IA{ int m1(int a); }
注:Lambda式にreturnステートメントが1つしかない場合は、次のように記述できます。
インターフェイス名の参照=(正式なパラメータリスト)->式;推奨されません。
3、ラムダ式の実用化
-
実用的なアプリケーション1:Lambda式を使用してRuannbleインターフェースを実装する
public class Test { public static void main(String[] args) { Runnable r = ()->{ for(int i=0;i<10;i++){ System.out.println("+++++++++++++++"+i); } }; new Thread(r).start(); } }
-
実用的なアプリケーション2:ラムダ式を使用してコンシューマーの実現を完了し、データを受信して対応する操作を完了します
public class Test { public static void main(String[] args) { Consumer<String> c = (String s)->{ System.out.println(s); }; c.accept("百知威武...."); } }
-
実用的なアプリケーション3:Lambda式を使用して、リストコレクションのトラバーサルを完了します
-
匿名の内部クラスを使用して以下を完了します。
``` List<String> list=Arrays.asList("胡老八","李四,"张三","胡明"); list.forEach(new Consumer<String>() { public void accept(String s) { if(s.contains("胡")){ System.out.println(s); } } });
-
Lambda式を使用して以下を完了します。
List<String> list=Arrays.asList("胡老八","李四,"张三","胡明"); list.forEach((s)-> { if (s.contains("胡")) { System.out.println(s); } }); 只是List集合打印遍历输出: list.for((s)-> System.out.println(s))
-
-
演習:複数の学生オブジェクトをコレクションArrayListに格納します。
-
学生コレクションのすべての男の子を除外します
-
学生コレクションで失敗したすべての学生を除外する
-
学生コレクションで失敗したすべての男子学生を除外する
-
学生セットで失敗した劉と名付けられたすべての男の子を除外します
-
-
演習2:Collections.sort()メソッドを呼び出し、Lambda式を渡すパラメーターとして使用して、カスタム並べ替え(最初に年齢で比較し、次にグレードで並べ替え)によって2つのSrudentを比較します。
public class Test { public static void main(String[] args) { ArrayList<Student> list = new ArrayList(); list.add(new Student("张三",23,88.0)); list.add(new Student("李四",26,98.0)); list.add(new Student("胡八一",25,78.0)); list.add(new Student("胡八一",25,88.0)); Collections.sort(list,(s1,s2)->{ if(s1.getAge()>s2.getAge()){ return 1; }else if(s1.getAge()<s2.getAge()){ return -1; }else{ return Double.compare(s1.getScore(),s2.getScore()); } }); list.forEach((s)-> System.out.println(s)); } }
4つの関数型インターフェース(ラムダ式には関数型インターフェースのサポートが必要です)
-
意味:インターフェースに抽象メソッドが1つしかないインターフェースは、機能インターフェースと呼ばれます。
-
カスタム機能インターフェース:アノテーション@FunctionalInterfaceを使用して、インターフェースが機能インターフェースであるかどうかを検出できます。
@FunctionalInterface interface IA{ int m1(int a); }
注:@FunctionalInterfaceアノテーションが付けられたインターフェースには、抽象メソッドが1つだけ存在する必要があります。カスタム機能インターフェイスの場合:
public class Test { public static void main(String[] args) { int r = optional(5,(m)->{return m*m;}); System.out.println("r="+r); } public static Integer optional(int n,MyFuntion f){ return f.getValue(n); } } //对一个整数进行计算操作,将计算的结果作为返回值返回 interface MyFuntion{ Integer getValue(int n); }
-
Java8.0に組み込まれた4つのコア機能インターフェース
-
コンシューマーインターフェイス:コンシューマー
- void accept(T t); —>パラメータはタイプTであり、戻り値はタイプvoidです。
-
供給インターフェース:サプライヤー
- T get(); —>パラメーターはパラメーターではなく、戻り値はタイプTです。
-
機能インターフェース:Function <T、R>
- R apply(T t); —>パラメータタイプはTタイプであり、戻り値はRタイプです。
-
アサーションインターフェイス:述語
-
boolean test(T t); —>パラメーターはT型であり、戻り値はboolean型です。
-
ケース1:コンシューマーインターフェイス:
public class TestFirst { public static void main(String[] args) { happy(20000.0,(s)-> System.out.println("拿着"+s+"元去消费....")); } public static void happy(double money, Consumer<Double> c){ c.accept(money); } }
-
ケース2:供給タイプのインターフェース
public class TestFirst { public static void main(String[] args) { happy(20000.0,(s)-> System.out.println("拿着"+s+"元去消费....")); String str=getString(10,()->{ String s = "anhjshfjshsairiweriwir89863lkkqljrkql"; java.util.Random rd = new java.util.Random(); int n=rd.nextInt(s.length()); return s.charAt(n); }); System.out.println(str); } public static String getString(int num, Supplier<Character> s){ String result=null; for(int i=0;i<num;i++){ String str=s.get()+""; result +=str; } return result; } }
-
ケース3:機能インターフェイス
public class TestFirst { public static void main(String[] args) { String r=changString("helloworld",(s)->s.toUpperCase()); System.out.println(r); System.out.println(changString("helloworld",(s)->s.substring(1,4))); } public static String changString(String s, Function<String,String> f){ return f.apply(s); } }
-
ケース4:アサーションインターフェイス
public class TestFirst { public static void main(String[] args) { List<String> list= Arrays.asList("zhangsan","lisi","wangwu","lily","tom"); List<String> asList=filterString(list,(s)->s.length()>4); for(String s:asList){ System.out.println(s); } } //将集合中所有的数据元素,根据条件进行过滤 public static List<String> filterString(List<String> list,Predicate<String> p){ List<String> asList=new ArrayList<>(); for(String s:list){ if(p.test(s)){ asList.add(s); } } return asList; } }
-
-
その他の機能インターフェイス:
-