例のJDK 8

最近、Brian GoetzがOracleブログで、Java SE 8の言語/ライブラリ/ VMの共進化に関するDevoxxトークのプレゼンテーションへのリンクを投稿しました。
この記事では、オラクルが選択した8つの主要な問題、およびそれらを解決する方法を簡単に明らかにしようとします。 他の側面は、オリジナルで見ることができます。

続きを読む:
既存の後方互換性のあるAPIを拡張します。
Javaはさらにオブジェクト指向になりつつあります。
Javaのラムダ式。
マルチスレッドを合理化します。

オラクルがしたいこと:

I.既存の後方互換性のあるAPIを拡張します。


すべてのjavistsの生活を簡素化するために、JDKを拡張/補足するとともに、全員(既存のフレームワークを含む)がAPIを補足できるようにすることが決定されました。 この場合、前提条件はレガシーコードの保存です。 このために、Oracleのメンバーは仮想拡張メソッドを作成しました。
仮想拡張メソッドは、既存のインターフェイスに追加できるメソッドであり、これらのメソッドのデフォルト実装を提供しますが、実装クラスは再コンパイルを必要とせず、以前と同じように機能します。 一方で、既存のAPIの健全性を維持し、機能を拡張する機能を取得します。

例はIteratorおよびUnsupportedOperationExceptionです。

Iteratorインターフェースのremoveメソッドを知っています。 javadocは、イテレータの実装がremoveメソッドをサポートしない場合、UnsupportedOperationExceptionをスローする可能性があると述べています。 同意し、曲がった。 メソッドを実装しない場合、なぜそれを定義して例外をスローする必要があるのですか?

解決策:

interface Iterator<T> { boolean hasNext(); T next(); void remove() default { throw new UnsupportedOperationException(); }; } 

これは、removeメソッドのデフォルトの実装を定義します。 実装クラスは、このメソッドの実装を提供する必要がなくなりました。

例はリストの繰り返しです。

2011年に学生の間で最高のスコアを決定するコードがあるとします。
 List<Student> students = ... double highestScore = 0.0; for (Student s: students) { if (s.getGradYear() == 2011) { if (s.getScore() > highestScore) { highestScore = s.score; } } } 

一見、かなりまともなコード。 しかし、オブジェクト指向ではありません。 リスト自体の反復は、このリストを使用するクライアントコードの「for」ループで行われます。 仮想メソッドをコレクションに追加し、既にオブジェクト指向のアプローチと「内部」反復を使用してこのコードを書き換えることができます。
 SomeCoolList<Student> students = ... double highestScore = students.filter(new Predicate<Student>() { public boolean op(Student s) { return s.getGradYear() == 2011; } }).map(new Mapper<Student, Double>() { public Double extract(Student s) { return s.getScore(); } }).max(); 

ここでは、SomeCoolListクラスによって既にいくつかの反復が実行されています。 しかし、あなたは認めなければなりません、それは非常に面倒で冗長です。 そして、ここでラムダ式が助けになります。

解決策:

 SomeCoolList<Student> students = ... double highestScore = students.filter(Student s -> s.getGradYear() == 2011) .map(Student s -> s.getScore()) .max(); 

このアプローチには別の利点があります-コレクション自体がコレクションを通過するため、実行の並列化が容易です。

II。 簡素化の簡素化


現在、マルチコアプロセッサを搭載したコンピューターがすでに標準になっているため、これらのカーネルを使用することが理にかなっていることは明らかです。 マルチスレッドプログラムを作成します。 したがって、JDK 8の次の改善点は、同時実行の簡素化です。
マルチスレッドおよび仮想拡張メソッドのみを使用する上記のコードは、次のように書き換えることができます。
 SomeCoolList<Student> students = ... double highestScore = students.parallel() .filter(Student s -> s.getGradYear() == 2011) .map(Student s -> s.getScore()) .max(); 


これで、8端の主な主要機能。

また、 こちらから Lambdaサポート付きのJDK Standard Edition 8開発者プレビューをダウンロードできることもお知らせします。

Source: https://habr.com/ru/post/J133666/


All Articles