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 タグ:

NetBeans 8 Dev を使って Lambda で遊ぶ その4

今回は その2 で作ったプログラムの年齢とバストサイズでフィルタリングし、ファイティングパワーで昇順ソートして生成した List を操作してみます。

といっても何も大したことはしていません。

とりあえず下記コードを追加しました。

jp\yucchi\mylambdasample\MyLambdaSample.java

        // MyBestMember の FightingPower の要素数を取得
        System.out.println("<-- MyBestMember の FightingPower の要素数を取得 -->");
        long count = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE
                && m.getAge() >= 16
                && m.getAge() <= 29
                && m.getBreast() >= 76)
                .map(MyTeam::getFightingPower)
                .count();
        System.out.println("要素数は " + count + " です。");



        // MyBestMember の FightingPower 最初の要素を取得 (最小値)
        System.out.println("<-- MyBestMember の FightingPower 最初の要素を取得 -->");
        int collect = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE
                && m.getAge() >= 16
                && m.getAge() <= 29
                && m.getBreast() >= 76)
                .map(MyTeam::getFightingPower)
                .sorted(Integer::compareTo)
                .collect(Collectors.toList()).get(0);
        System.out.println(collect);
        
        
        // MyBestMember の FightingPower 最後の要素を取得 (最大値)
        System.out.println("<-- MyBestMember の FightingPower 最後の要素を取得 -->");
        int collect2 = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE
                && m.getAge() >= 16
                && m.getAge() <= 29
                && m.getBreast() >= 76)
                .map(MyTeam::getFightingPower)
                .sorted(Integer::compareTo)
                .collect(Collectors.toList()).get((int) (count - 1));
        System.out.println(collect2);


        // MyBestMember の FightingPower 全要素を表示
        System.out.println("<-- MyBestMember の FightingPower 全要素を取得 -->");
        List collect3 = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE
                && m.getAge() >= 16
                && m.getAge() <= 29
                && m.getBreast() >= 76)
                .map(MyTeam::getFightingPower)
                .sorted(Integer::compareTo)
                .collect(Collectors.toList());
        System.out.println(collect3);

    }
}

要素数は stream オブジェクトのエレメント数を count() メソッドで取得しただけです。

戻り値が long なので要注意です。

これを利用して新しく生成された List<Integer> オブジェクトを操作して最小値と最大値を求めています。

ここで long の count を int にキャストしているのがちょっとアレですね・・・

もっとスマートな方法があるのかもしれません。

最後は新しく生成された List<Integer> オブジェクトを表示させただけです。

結局、stream でゴニョゴニョやってそれで新しい List にしてしまえば今までどおりチョメチョメ操作できてしまうってことかな?

ほとんど Lambda とは関係ない内容になってますが stream オブジェクトの要素数の取り方ってことでお茶を濁します。( ̄。 ̄;)

あっ、ちなみに実行結果は次のようになります。

<– MyBestMember の FightingPower の要素数を取得 –>
要素数は 7 です。
<– MyBestMember の FightingPower 最初の要素を取得 –>
66
<– MyBestMember の FightingPower 最後の要素を取得 –>
89
<– MyBestMember の FightingPower 全要素を取得 –>
[66, 75, 76, 80, 85, 85, 89]

Hatena タグ: ,