例の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開発者プレビューをダウンロードできることもお知らせします。



All Articles