Java 8 Date and Time API の素敵なコード

Java 8 で採用される Lambda よりもひょっとしたら素敵な Date and Time API の素晴らしい使い方をネットで見つけました。

NetBeans 8 Dev を使って Lambda で遊ぶ その2 で Date and Time API を使って年齢を取得しました。

今日、ネットサーフィン(死語)で素晴らしいコードを見つけたのでそれを使ってみました。

変更前のコード

public int getAge() {
    LocalDate today = LocalDate.now();
    int age = today.getYear() - birthday.getYear();
    if (birthday.getMonthValue() > today.getMonthValue()
            || birthday.getMonthValue() == today.getMonthValue()
            && birthday.getDayOfMonth()
            > today.getDayOfMonth()) {
        age--;
    }
    return age;
}

変更後のコード

public int getAge() {
    LocalDate today = LocalDate.now();        
    return Period.between(birthday, today).getYears();
}

とてもすっきりしてますね(^_^)

この情報は日本語でこちらのサイトの記事を参考にさせていただきました。

年齢を計算する、java.util.Calendarとjava.time.LocalDateとで

詳しく丁寧に解説されていますので興味のある方は参考に!

ちなみに、私は年齢の繰り上がる日時を今の今まで思い違いをしてました( ̄。 ̄;)

Hatena タグ:

Lambda の罠

このところ Java 8 で注目の Lambda を NetBeans 8 Dev を使ってネットから情報収集して楽しんでます。

今回は絶対はまりそうなコードを紹介します。

Lambda に興味がある人は既にご存じかと思いますが、なかなか面白そうなのでよかったら見てください。

では次のプログラムを実行したらどうなるでしょうか?

jp\yucchi\mylambda_2\MyLambda_2.java
package jp.yucchi.mylambda_2;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Spliterator;
import java.util.concurrent.ConcurrentHashMap;

public class MyLambda_2 {
    private final static int WOW = 1_000;

    public static void main(String... args) {
        Map m = new ConcurrentHashMap<>();
        for (int i = 0; i < WOW; i++) m.put(i, i);
        List root = new ArrayList<>();
        m.keySet().spliterator().forEach(root::add);
        List _root = new ArrayList<>();
        Spliterator right = m.keySet().spliterator();
        Spliterator left = right.trySplit();
        left.forEach(_root::add);
        right.forEach(_root::add);
        System.out.println(_root.size() == root.size());
        System.out.println(_root.equals(root));
        System.out.println(new HashSet(root).equals(new HashSet(_root)));
    }
}

簡単じゃないかと思ったあなた!

正解です。(^_^)

私のコンピュータでの実行結果は次のようになります。

run:
true
true
true
BUILD SUCCESSFUL (total time: 0 seconds)

では、このプログラムの WOW 定数をもっと大きな値にしてみたらどうなるでしょうか?

11 private final static int WOW = 10_000;

それでは実行してみます。

run:
true
false
true
BUILD SUCCESSFUL (total time: 0 seconds)

とても素敵な結果が表示されました。(;゜ロ゜)

たぶん、感の鋭い方なら 25 行目のコードをみただけでこのような結果になるのは容易に想像できたでしょう。

これって絶対はまりそうな気がするのは私だけでしょうか?

Hatena タグ: