*

java8(JDK8)の新機能[大幅に強化されたコレクションAPI:java.util.List] をeclipseとJUnitで確認する。

公開日: : 最終更新日:2015/05/01 Eclipse, Java, JUnit ,


スポンサードリンク



Java8(JDK8)では、ラムダ式の導入を前提とした、コレクションAPIの新機能が追加されました。
本エントリーでは、このコレクションAPIの新機能(強化部分)をJUnitのユニットテストを書きながら説明をさせていただきます。

利用する環境は、Java8に対応したEclipse(4.4)となります。

java.util.Listに追加されたメソッド

java.util.Listに追加されたメソッドは以下の4つです。

  1. forEach
  2. sort
  3. replaceAll
  4. removeIf

forEachメソッド

拡張for文の動作と同じです。それを以下のJUnitのユニットテストのコードで検証してみました。

ソースのコメントに記載している通りですが、ListのforEachと拡張for文が同じ動作をしていることがご理解いただけると思います。

内部処理というほどでもありませんが、両処理ともstaticなメソッドaddElementを呼び出すだけですので、
純粋にforEachと拡張for文の動きが同じである事をイメージしていただけると思います。

実行結果は以下のようになりました。
スクリーンショット 2014-05-25 14.14.37

sortメソッド

sortメソッドが導入されるまでは、java.util.Collections.sortを用いることが一般的でした。
ソート時の各要素の比較処理がデフォルトの処理でOKであれば、至極使いやすいメソッドです。
(Listの要素のオブジェクトの比較処理で昇順に並び替える)

しかし、少し変わった比較処理を利用してソートする場合は、
java.util.Comparatorインターフェースを実装したクラスが必須となります。

数値を文字列に変換したリストのソート

・java.util.Collections.sortを利用した実装例

10から0の数値を文字列に変換した値を要素に持つListを作成し
これをjava.util.Collections.sortでソートし、
ソート後のリストの要素をSystem.out.printlnで出力してみます。

なお、これ以降は、対象となるテストケースのみを記載させていただきます。

出力結果は以下のようになりました。

1の後に10が・・・、文字列として比較されているので、昇順に並ぶとそうなりますよね。

これを数値の大小比較の昇順で並べるようにすると、java.util.Comparatorインターフェースの利用が必須となります。

無名クラスのComparatorを作成して、ソート時に指定するように変更し、
ソート後に、assertEqualsで数値の昇順にソートされているかを検証するようにしました。

JUnitのテストも通りました。
スクリーンショット 2014-05-25 17.43.27

・Listのsortメソッドを利用した実装例
先ほどは、java.util.Collections.sortを利用したソートでしたが、
今度はjava.util.Listのsortメソッドを利用します。

それにしてもtestSortと同じコードが多いですね・・・、せっかくラムダ式で行数が減ってるのに・・・

先にJUnitのテストを実行結果です。成功しました。
スクリーンショット 2014-05-25 18.04.13

コードの行数は4行減っています。何より処理が直感的になっていると思います。

replaceAllメソッド

条件に合致するListの要素を全て削除するメソッドです。本当に便利です。

・ListのreplaceAllメソッドを利用しない実装例
replaceAllの便利さを際立たせるために、replaceAllを利用しない例を書いてみました。
みましたって、書けないですね・・・

java.util.CollectionsのスタティックメソッドreplaceAllの定義は
static boolean replaceAll(List, Object, Object)で、
第一引数のListに存在する第二引数を第三引数に置換するとのメソッドです。

ListのreplaceAllメソッドとの機能差が大き過ぎて代用品にはなり得ませんが
CollectionsのreplaceAll機能の範囲で同じ処理を実装してみます。

Collections.replaceAllの実装例

・ListのreplaceAllの実装例
先ほどの「java.util.CollectionsのスタティックメソッドreplaceAllを利用した例」
に相当する処理をListのreplaceAllメソッドを利用して実装してみます。

コードコメントの通り、三項演算子を利用しているので少し分かりずらいかもしれませんが、
ラムダ式だからこそできる処理です。

JUnitのテストも成功しました。
スクリーンショット 2014-05-25 19.30.00

もう少し複雑な例の検証を追加してみます。

リストの要素の文字列で、”a”または”A”から始まるものは”aから始まる”を先頭に付与する。
それ以外の文字列は何もしない。との処理となります。
追加処理は15行目からとなっております。

以上のようにCollections.replaceAllに比べると色々できます。

removeIfメソッド

JDK7以前には、これに対応するメソッドは存在していませんでした。
普通にループを回して、条件に合う要素を除去するぐらいしかできません。

removeIfメソッドを利用して同じ処理を実装すると以下のようになります。

まとめ

このように、java.util.Listに追加されたメソッドとラムダ式を併用することで、
タイピングの数も減るし、コードがスッキリして読みやすくなると言えます。

複雑なラムダ式を書いてしまうと逆に読みにくくなりますが、
Listに対する実装が格段に楽になるパターンがある事は明らかですので、是非ご利用ください。

「 java8(JDK8)の新機能[大幅に強化されたコレクションAPI:java.util.List] をeclipseとJUnitで確認する。」は以上です。


スポンサードリンク



関連記事

java8(JDK8)の新機能をEclipseとJUnitで[インターフェースのデフォルト実装の使い方]

本エントリーでは、まずSAM Typeの説明をさせていただきます。 その流れの中で「java8の新

記事を読む

Mac(OS X)におけるJava8(jdk8)等のインストール、アップデート、アンインストール方法

Windowsとは異なりMac(OS X)ではJDKの管理(インストール、アンインストール)が難しい

記事を読む

JUnit入門その8[Eclipse4.4のJUnitプラグインのテストケースのカバレッジをEclEmmaを利用して測定してみる]

今回は「EclEmma」を使って、テストのカバレッジの測定を行うエントリーとなります。 「djUn

記事を読む

「HyperSQL」の環境を作成し、Eclipseの「DBViewer」プラグインを利用してSQLを発行してみる

Eclipseの「DBViewer」プラグインを利用して「Java DB」の環境を作成し、SQLを発

記事を読む

お勧め本紹介[新装版 リファクタリング―既存のコードを安全に改善する― (OBJECT TECHNOLOGY SERIES)]

リファクタリング―プログラムの体質改善テクニック (Object Technology Series

記事を読む

Eclipse(4.3,4.4)のJava言語のリファクタリング機能の使い方[リファクタリングの説明と「名前変更」と「移動」]

本エントリーでは、Eclipse(4.3,4.4)の「リファクタリング」機能の使い方を説明させていた

記事を読む

java8(JDK8)の新機能のラムダ式の利用方法をEclipseとJUnitで説明[その2:関数型インターフェースを例としたラムダ式]

「JDK8(Java 8)の新機能のラムダ式の利用方法」では、 指定できる場所の概説と関数型インタ

記事を読む

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思っていたのですが、ついに作成してみ

記事を読む

Eclipseの使い方(Eclipse4.4のブックマーク機能とタスク機能)

今回は、Eclipseのブックマーク機能とタスク機能の説明をさせていただきます。 両機能とも効率的

記事を読む

JUnit入門その2[Eclipse4.4のJUnitプラグインのassertThatの使い方]

JUnit入門その1ではEclipseのJUnitプラグインの基本的な使い方を説明させていただきまし

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

Selenium3も3.0.1がリリースされましたし、今後は本格的にS

Selenium利用時のトラブルシューティング方法[クリック編]

Seleniumは便利なテスト自動化ツールですし、今後は更なる利用者の

Java8のラムダ式とStream APIを利用してコーディング量の削減サンプル集

Java8になりラムダ式と「Stream API」が利用できるようにな

Selenium入門その5[ページオブジェクトパターン(Page Object Design Pattern)を利用して変更に強いテストを作成する方法]

Selenium入門その2 では「UIマップファイル」と言う仕組みが

Javaによる非同期処理入門その1[非同期処理の実装方法の概説]

Javaによる非同期処理に関するエントリーを前々から作成したいと思って

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑