新機能Java8のご紹介
①、より速く
②、少ないコード(新しい構文を追加:ラムダ式)
③、強力なストリームAPI
④、平行に適し
⑤、NULLポインタ例外の削減を最大化するには:オプションを
ラムダ式
- 1.なぜ、ラムダ式を使用できますか?
ラムダは匿名関数である、我々はそれがコード渡された(データと同じになりますパスコード)の一部として理解することができるラムダ式を置くことができます。より簡潔な、より柔軟なコードを書くためにそれを使用してください。よりコンパクトなコードスタイルとしては、Java言語のスキルが向上しています。
- 2、ラムダ式を使用して
例:(O1、O2) - > Integer.compare(O1、O2)
形式:
- > :lamdbaオペレータまたは矢印演算子
- >左:lamdbaパラメータリストを(実際には、インタフェースの抽象メソッドのパラメータのリストです)
- >右側:lamdba体が(実際には、抽象メソッドの本体がオーバーライド方法です)
- 3、匿名クラスからラムダ例を変換します
@Test
public void test1(){
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello World!");
}
};
r1.run();
Runnable r2 = () -> System.out.println("Hello Lambda!");
r2.run();
}
@Test
public void test2(){
Comparator<Integer> com1 = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
int compare1 = com1.compare(12,13);
System.out.println(compare1);//-1
//Lambda表达式的写法
Comparator<Integer> com2 = (o1,o2) -> Integer.compare(o1,o2);
int compare2 = com2.compare(14,13);
System.out.println(compare2);//1
//方法引用
Comparator<Integer> com3 = Integer :: compare;
int compare3 = com3.compare(14,13);
System.out.println(compare3);//1
}
- 4、ラムダ式の構文
①、Lamdba構文:
Runnable r1 = () -> {System.out.printn("Hello Lambda!");};
②、2つの構文::ラムダは、引数が、ノーリターン値が必要です。
Consumer<String> con = (String str) -> {System.out.printn(str);};
③、3構文:コンパイラによって推測されるデータの種類は、「型推論」と呼ばれる、省略することができます
Consumer<String> con= (str) -> {System.out.printn(str);};
ラムダの場合は、パラメータを1つだけ取るとき④、構文4 ::、パラメータは括弧を省略することができます
Consumer<String> con = str -> {System.out.printn(str);};
⑤、構文5 ::ラムダは、複数のステートメントを実行し、二つ以上のパラメータを必要とし、戻り値が存在することができ
Comparator<Integer> com= (x,y) -> {
System.out.printn("实现函数式接口方法! ");
return Integer.compare(x,y);
};
⑥、構文6:ラムダ唯一の体、声明、リターン番号とかっこ
Comparator<Integer> com= (x,y) -> Integer.compare(x, y);
要約:
- >左:パラメータ型ラムダパラメータリスト(種別判定)を省略してもよい;ラムダパラメータリストを唯一のパラメータ、対の一方が()を省略することができる場合
- >権利:本体は{}の対で包まれるべきであるラムダ、ラムダ本体のみステートメントが実行された場合には(おそらく文を返す)を省略することができるとキーワードのリターン{}
機能性(機能)インタフェース
-
1、ラムダ式の性質:の関数としてのインターフェースの例
-
インタフェースは唯一の抽象メソッドを宣言した場合2は、このインターフェースは、機能インタフェースと呼ばれ、私たちは、インターフェイス上で@FunctionalInterfaceアノテーションを使用することができ、そうすることは、関数インタフェースであるかどうかを確認することができ、実装クラスは、匿名で表されます今ラムダ式は、書き込みに使用することができます
-
図3は、Javaは、4つのコア機能インタフェースを構築し
例えば:
@Test
public void test3(){
List<String> list = Arrays.asList("北京","南京","天津","牛津","东经","西经");
List<String> filterStrs = filterString(list, new Predicate<String>() {
@Override
public boolean test(String s) {
return s.contains("京");
}
});
System.out.println(filterStrs);
//Lambda表达式的写法
List<String> filterStrs1 = filterString(list,s -> s.contains("京"));
System.out.println(filterStrs1);
}
//根据给定的规则,过滤集合中的字符串。此规则由Predicate的方法决定
public List<String> filterString(List<String> list, Predicate<String> pre){
ArrayList<String> filterList = new ArrayList<>();
for(String s : list){
if (pre.test(s)){
filterList.add(s);
}
}
return filterList;
}
- 図4に示すように、他のインターフェイス
メソッドの参照
-
図1に示すように、使用シナリオ:ラムダ体メソッドを実装しているオペレータに送信する、方法が参照を使用することができます
-
2、メソッド参照、機能インタフェースの例として、本質的にラムダ式、およびラムダ式。したがって、参照方法、インタフェースインスタンスの関数でもあります
-
3、フォーマット使用:クラス(またはオブジェクト)メソッド名::
-
図4に示すように、次の3つの場合の特定に分かれ
对象 :: 非静态方法 类 :: 静态方法 类 :: 非静态方法
-
同じタイプの抽象メソッドとインターフェースメソッドの要求パラメータのリストを返すタイプの参照パラメータリストの値と戻り値:5は、使用法の参照を必要とします
例えば:
Employee emp = new Employee( 1001, "Tommey", 23, 5600);
Supplier<String> sup1 = () -> emp . getName();
System.out.print1n(sup1.get());//Tommey
Supplier<String> sup2 = emp :: getName;
System.out.println(sup2.get());//Tommey
コンストラクタの参照
- 図1に示すように、基準法など、及び一貫したインターフェース抽象メソッドの関数のパラメータリストのコンストラクタパラメータリスト
抽象メソッドの戻り値型がタイプは、クラスコンストラクタに属しています - 2、形式:クラス名::新しい配列参照
配列参照
- 1.フォーマット:タイプ[] ::新しい配列参照