読者です 読者をやめる 読者になる 読者になる

iPX社員によるブログ

iPX社員が"社の動向"から"自身の知見や趣味"、"セミナーなどのおすすめ情報"に至るまで幅広い話題を投下していくブログ。社の雰囲気を感じ取っていただけたら幸いです。

Java8によってJava技術者に変化が求められると言う話

はじめまして、7月から入社しました、和田です。
ちょっと前までは某SIerに所属して色々作ってました。

最近社長がそろそろブログに方向性持たせたいなどとボヤいており、仕方がないので(喜んでと言いなさい by 幸田)技術的な話題で行こうと思います。

Javaに訪れた変化

2014年の3月にリリースされたJava8ですが、個人的には久々のビッグウェーブ到来と見ています。

Javaの世界は過去にJava1.4→Java5のタイミングでコードスタイルが大幅に変わりました。
それはJava5で実装された以下のような機能によります。

  • 総称型の実装による引数の型安全性向上
  • オートボクシングによるプリミティブ型とラッパークラスの相互変換
  • 拡張Forループ(foreach)によるIteratorを利用したコードの駆逐
  • アノテーションによるリフレクションの自由度向上


Java1.4の頃はこうやって書いていたものが

private SupplierDao supplierDao;

public HogeService(ApplicationContext context) {
    supplierDao = (SupplierDao) context.getBean(SupplierDao.class);
}

public int getCount(String cond) {
    int count = 0;
    List searchResult = supplierDao.search(cond);
    for (Iterator ite = searchResult.iterator(); ite.hasNext();) {
        SupplierBean supplier = (SupplierBean) ite.next();
        count += supplier.getCount().intValue();
    }
    return count;
}


Java5ではこんな書き方になりましたね。

@AutoWierd
private SupplierDao supplierDao;

public int getCount(String cond) {
    int count = 0;
    List<SupplierBean> searchResult = supplierDao.search(cond);
    for (SupplierBean supplier : searchResult) {
        count += supplier.getCount();
    }
    return count;
}

当時は随分と大胆な変更を入れて来たなぁと、ヒヨッコ技術者なりに思っていたものです。
実際に一緒に仕事をしていた先輩方の何割かは変化の大きさについて来れて居ませんでした。

Java6 や Java7の頃はどうだったのよ?

Java6 や Java7 でも便利な機能が追加されては居ますが、
個人的には、それらはJava5で訪れた変化を洗練させる方向に向いていたように感じます。

以下、6と7の記憶に残る変更点

Java6

  • ファイルの権限変更が可能に
  • Desktopプログラミングの強化

Java7

  • リソース付きtry-catch文
  • switchでの文字列比較
  • 2進数リテラル

こんな感じなので、個人的には「今まで出来た事がもっと良いやり方で出来るようになったな」と言った印象です。


まぁ、よくあるダサいこのコードが

InputStream is = null;
try {
    is = new FileInputStream(f);

    // ファイルの読み込み処理

} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (is != null) {
        try {
            is.close();
        } catch(Exception e) {
            ;;
        }
    }
}

こう掛けるようになったのはすごく便利なんですけどね。

try (InputStream is = new FileInputStream(f)) {

    // ファイルの読み込み処理

} catch (IOException e) {
    e.printStackTrace();
}

で、結局Java8はどう違うのさ?

Java8の大きな変化点として以下のような物があります

  • interfaceにdefault処理を記述出来るようになった為、多重継承のような事が出来るように
  • ラムダ式メソッド参照によって、Javaでの関数型プログラミングが実現
  • Streamインターフェースによってオブジェクト集合に対する操作が用意に

C#をやった事がある人はそこまで違和感がないかと思いますが、
根っからのJava人間にとっては、ラムダ式やStreamあたりで強い拒絶反応が予想されます。

ラムダ式などを利用したコード例

// 取引回数が10件以上の取引先の情報を出力する
supplierList.stream()
    .filter(supplier -> supplier.getTransactionCount() >= 10)
    .foreach(System.out::println);

「うん。このJava、俺の知ってるJavaじゃない。」
ってなりました。

まぁ、そこは技術者のはしくれとして、新たな変化に対応していかないといかんなぁと。


Java5の時、変化に対応しきれない30代の先輩社員に対して、

「これだから頭の固いオッサンは。。。」

と、言う目で見ていた10年くらい前の自分を思い返しながら。

「今度は自分がそう見られる番」

といった状況だと自覚し、日々戦々恐々としております。

と、言うことで。。。

今後、自分の勉強の為に、Java8の新機能に関する内容とか、
それ以外にも色々な活用法とかをこのブログで定期的に書いていこうかなと思ってます。

勉強するに当たって、アウトプットって大事ですしね。

と、言うわけで今回はこんな所で。
次回以降シリーズ化していこうと思うのでよろしくお願いします。
(まだ構想すら練ってませんが)