序文
java13は、物事の使用java5まだ、多くの学生が来ています。あなたは、毎日の開発にjava8に新機能の一部を使用していないか、使用しない場合。この記事はあなたを助けるかもしれません。
ラムダ式
入門
ラムダ式は、コードをよりエレガントにするために、匿名の呼び出しによって、新しい構文をjava8れます。
機能インタフェース
入門
より親しみやすいサポートラムダ式の場合は、java8で機能的なインターフェースの概念が導入されました。
- 「機能インタフェース」のみを指すだけ抽象メソッドを含むが、非抽象メソッド(変性デフォルトの方式デフォルト)インターフェースが複数存在してもよいです。
- あなたが使用できる「機能インタフェース」
@FunctionalInterface
の注釈は、インターフェイス上で宣言しました。だから、このコメントは、あなたが見インターフェイス上の関数インタフェースであります。
機能インタフェースにラムダ式を使用します
以下のコードを見てください
@Test
public void FunctionalInterface(){
new Thread(new Runnable() {
@Override
public void run() {
print();
}
});
new Thread(
() ->{print();}
);
new Thread(() -> print());
new Thread(this::print);
}
public void print(){
System.out.println("hello domain");
}
复制代码
上記従来の方法匿名の内部クラスで最初のインターフェイスインスタンスを作成、のRunnableインタフェース機能インタフェースです。作成したインターフェイスインスタンスのラムダを使用するには、残りの三つの方法。他の三つの構文の説明の下、言うことは最初は何もありません。
- 最初のものは、完全なラムダ構文の一般的な構文で、フォーマットは:
() -> {}
小括弧方法ロジック内部ブレースでインタフェースメソッドを通過するパラメータです。あなたは、ビューのインタフェースポイントの匿名の実装方法を制御することができます。 - 第2の実施形態では、コードは、括弧を省略することができ、コードである第一の比較少なく括弧、中括弧。
- 第三の方法は、参照方法を残し、ラムダメソッド参照、括弧、なくなっブレースと呼ばれます。上院へと引数の括弧内の括弧内のメソッドの呼び出しが同じであるため、なぜ我々は、行うことができます。例では、括弧と括弧メソッド呼び出しは引数ではない、場合には、このような引数を持っているでしょう。
@Test
public void testFunctionalInterface(){
WebService webService = this::print;
webService.sayHi("domain");
}
public void print(String str){
System.out.println("hi:"+str);
}
复制代码
上記の例では、2つの点、第上記と言われ、そこラムダ練習パラメータ、及び第二の表示ラムダ式が実際にインタフェースのインスタンスを実装して戻ります。
メソッドの参照
3つの方法が方法があり、参照されている类名::方法
、、 对象::方法
、类名::new
この最後のコンストラクタ構文が参照されています。
ストリーム
入門
stream
Java8は、さまざまな操作を設定した方が良い、ラムダと、新しいAPI(地図は含まない)に設定されています。
使用
リストのコレクションを作成し、操作をストリーミングするためにそれを使用。
List<User> users = new ArrayList<>();
users.add(new User("domain",18));
users.add(new User("alex",19));
users.add(new User("lily",20));
users.add(new User("joy",21));
复制代码
フィルター(フィルター)
データ収集フィルタ、フィルタ方式を使用して、例えば、私はのコレクションに18以上の人が古い取得したいです:
List<User> users = users.stream()
.filter(new Predicate<User>() {
@Override
public boolean test(User user) {
return user.getAge() > 18;
}
}).collect(Collectors.toList());
复制代码
匿名の内部実装は、あなたが達成するためにラムダ式を使用することができることがわかります。
List<User> users = users.stream()
.filter(user -> user.getAge() > 18).collect(Collectors.toList());
复制代码
説明:オブジェクトを取得するuser.stream蒸気、フィルター濾過、収集オブジェクトを濾過生成するようにした後は、元のオブジェクトので、変化しません。
型変換(マップ)
コレクション型と変化の要素を、私はコレクションのすべての名前のコレクションを取得したい場合:
users.stream()
.filter((user) -> user.getAge() > 18)
.map(User::getName)
.forEach(System.out::println);
复制代码
このようなすべての名前の出力があります。マップは、単に収集して、オブジェクトの新しいコレクションに変換することができた後。例としては、各要素による出力のforEachアウトをしません。
マッチ(試合)
コレクション、試合中の要素を探します。
- どちらの試合
今私は、コレクションがあるかどうかを知りたい
domain
人、その名前のは、
boolean anyMatch = users.stream().anyMatch(user -> "domain".equals(user.getName()));
复制代码
- すべての試合
呼び出された場合は、コレクションの名前
domain
boolean allMatch = users.stream().allMatch(user -> "domain".equals(user.getName()));
复制代码
- 一致していません
コレクションがないかどうか
domain
の名前
boolean noneMatch = users.stream().noneMatch(user -> "domain".equals(user.getName()));
复制代码
オプショナル
Optional
Java8はセキュリティAPIのヌルの問題を解決するために提供され、人気のポイントは、文ブランクチェックデータを言うことです。次の例を考えてみましょう
- 私はこのように、ユーザーオブジェクトの値を取得したいです:
user = userService.getUser();
if (user == null) {
throw new Excepiton("用户不存在");
}
复制代码
あなたが文を空にするためにデータを見ることができ、コードは非常に退屈することができます。オプションのAPIは、この判断は、よりエレガントになることができます、ブランクチェックのセットを提供します。
- orElseThrow
User user = Optional.ofNullable(userService.getUser()).orElseThrow(() -> new Exception("用户为空为空"));
复制代码
呼び出すことによって、上記orElseThrow
ではuser
空で、例外が対応をスローされます。Optional.ofNullable
操作対象の指定されたオブジェクトです。
- orElseGet
String name = Optional.ofNullable(user.getPerson().getName()).orElseGet(() -> "domain");
复制代码
使用orElseGet
オブジェクトがnullに設定すると、デフォルト値が返されます。