Java
Java NetBeans
今日は substream() メソッドを使ってみます。
これを使って MyLambdaSample プロジェクトの MyLambdaSample.java に MyBestMember を FightingPower 詳細昇順ソート 最初から3人までスキップさせます。
使い方は簡単で substream() メソッドの引数にスキップさせたい要素数を渡せばいいだけです。
コードは下記のようになります。
jp\yucchi\mylambdasample\MyLambdaSample.java |
212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
// MyBeatMember を FightingPower 詳細照準ソート 最初から3人までスキップする System.out.println("<-- MyBeatMember を FightingPower 詳細昇順ソート 最初から3人までスキップする -->"); member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .sorted((o1, o2) -> o1.getFightingPower() - o2.getFightingPower()) .substream(3) .collect(Collectors.toList()) .forEach(e -> { System.out.println(e.getName() + ", " + e.getAge() + "歳, " + "Gender : " + e.getGender() + ", " + "Breast Size : " + e.getBreast() + ", FightingPower : " + e.getFightingPower()); }); |
とても便利ですね!
実行結果も確認しておきましょう。
<– MyBeatMember を FightingPower 詳細昇順ソート 最初から3人までスキップする –>
北川 景子, 26歳, Gender : FEMALE, Breast Size : 78, FightingPower : 80
綾瀬 はるか, 28歳, Gender : FEMALE, Breast Size : 88, FightingPower : 85
佐々木 希, 25歳, Gender : FEMALE, Breast Size : 80, FightingPower : 85
石原 さとみ, 26歳, Gender : FEMALE, Breast Size : 82, FightingPower : 89
Java 8 の Lambda とても素敵です。(^_^)
TAGS: Java,NetBeans |
2013年3月28日10:31 AM |
Java NetBeans
今回は limit() メソッドを使ってみます。
MyLambdaSample プロジェクトの MyLambdaSample.java に MyBeatMember を FightingPower 詳細昇順ソート 最初から3人まで とういう機能を実装します。
limit() メソッドを使うと簡単にできてしまいます。( 203 行目 )
jp\yucchi\mylambdasample\MyLambdaSample.java |
196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
// MyBeatMember を FightingPower 詳細照準ソート 最初から3人まで System.out.println("<-- MyBeatMember を FightingPower 詳細昇順ソート 最初から3人まで -->"); member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .sorted((o1, o2) -> o1.getFightingPower() - o2.getFightingPower()) .limit(3) .collect(Collectors.toList()) .forEach(e -> { System.out.println(e.getName() + ", " + e.getAge() + "歳, " + "Gender : " + e.getGender() + ", " + "Breast Size : " + e.getBreast() + ", FightingPower : " + e.getFightingPower()); }); |
limit() メソッドの引数に制限数を渡すだけですね。
今回は3人ということなので 3 を渡しています。
実行結果は次のように期待通りの結果となりました。
<– MyBeatMember を FightingPower 詳細昇順ソート 最初から3人まで –>
武井 咲, 19歳, Gender : FEMALE, Breast Size : 76, FightingPower : 66
剛力 彩芽, 20歳, Gender : FEMALE, Breast Size : 77, FightingPower : 75
堀北 真希, 24歳, Gender : FEMALE, Breast Size : 78, FightingPower : 76
便利に使えそうですね。(^_^)
TAGS: Java,NetBeans |
2013年3月27日8:30 AM |
Java NetBeans
今日も Java 8 に備えて良く解らないけど未来のコードと戯れたいと思います。
今回は、Functional Interface と Virtual Extension Methods を試してみたいと思います。
ただ、@FunctionalInterface の使い方がこれであっているのか?解りません(>_<。)
@FunctionalInterface を消しても同じようにコンパイル、実行できてしまうんですよね~
@Override なんかと同じでただの注釈なのかなぁ・・・
メリットが良く解らんぜよw
Virtual Extension Methods は以前にも試したんだけど default キーワードのつく位置が変わったの(決められた)のかな。
さて、それでは試してみます。
jp\yucchi\myfunctionalinterface\MyFunctionalInterface.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
package jp.yucchi.myfunctionalinterface; public class MyFunctionalInterface { @FunctionalInterface private interface FuncInterface { public void hoge(); // 対象メソッド @Override public String toString(); // あっても関係ないね @Override public boolean equals(Object o); // あっても関係ないね } @FunctionalInterface private interface CompFuncInterface extends FuncInterface { // Virtual Extension Methods default public void foo() { System.out.println("foo"); } // Virtual Extension Methods default public void bar() { System.out.println("bar"); } } public static void main(String[] args) { chome(() -> { System.out.println("hoge"); }); } private static void chome(CompFuncInterface cfi) { cfi.hoge(); cfi.foo(); // Virtual Extension Methods cfi.bar(); // Virtual Extension Methods } } |
実行結果は次のとおりです。
run:
hoge
foo
bar
BUILD SUCCESSFUL (total time: 0 seconds)
実行結果からみて Functional Interface の動作は定義されているとおりに問題なく動いているようです。
Functional Interface の定義については長くなりますのでググってみてください。
日本語で詳しく説明されているサイトが見つかるはずです。
今回のプログラムでは
|
@Override public String toString(); // あっても関係ないね @Override public boolean equals(Object o); // あっても関係ないね |
Object クラスのこの二つのメソッドがあっても問題ないこと、
|
// Virtual Extension Methods default public void foo() { System.out.println("foo"); } // Virtual Extension Methods default public void bar() { System.out.println("bar"); } |
この Virtual Extension Methods の default 実装があっても Functional Interface の機能を問題なく実行できることを証明しました。
ちゃんとラムダ式で動いてます。(^_^)
|
chome(() -> { System.out.println("hoge"); }); } |
実行結果からちゃんと二つの Virtual Extension Methods も動いているのが解ります。
Java 8 の正式リリースが楽しみですね(*^▽^*)
TAGS: Java,NetBeans |
2013年3月25日7:21 AM |
Java
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とで
詳しく丁寧に解説されていますので興味のある方は参考に!
ちなみに、私は年齢の繰り上がる日時を今の今まで思い違いをしてました( ̄。 ̄;)
TAGS: Java |
2013年3月23日10:46 PM |
Java
このところ Java 8 で注目の Lambda を NetBeans 8 Dev を使ってネットから情報収集して楽しんでます。
今回は絶対はまりそうなコードを紹介します。
Lambda に興味がある人は既にご存じかと思いますが、なかなか面白そうなのでよかったら見てください。
では次のプログラムを実行したらどうなるでしょうか?
jp\yucchi\mylambda_2\MyLambda_2.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
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<Integer, Integer> m = new ConcurrentHashMap<>(); for (int i = 0; i < WOW; i++) m.put(i, i); List<Integer> root = new ArrayList<>(); m.keySet().spliterator().forEach(root::add); List<Integer> _root = new ArrayList<>(); Spliterator<Integer> right = m.keySet().spliterator(); Spliterator<Integer> 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 行目のコードをみただけでこのような結果になるのは容易に想像できたでしょう。
これって絶対はまりそうな気がするのは私だけでしょうか?
TAGS: Java |
2013年3月20日5:54 AM |
« 古い記事
新しい記事 »