Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?

Java SE 8で導入されたラムダ式は、どのような仕組みで実現されているのだろうか? ラムダ式をより深く理解したいと考える読者にとって、これは気になるテーマの1つだろう。その秘密をお教えしよう。 Java SE 8で導入されたラムダ式は、Javaの言語仕様の歴史において最大級の変更だとされている。ただし、これはあくまでもJava言語の文法レベルの話であり、Javaプログラムを実行するJava仮想マシン(JVM)に新たな仕組みが導入されたわけではない。つまり、言語仕様に関する旧バージョンとの相違はコンパイラとランタイムが吸収し、バイトコードレベルでの互換性は保たれているということだ。 それでは、このような大きな変更を、既存のJVMの仕組みの中でどのように実現したのだろうか。それを知ることは、ラムダ式をより深く理解する手助けとなるかもしれない。Java SE 8のラムダ式実現の経緯と仕組みに
夜中に8/15頃のツイートが回ってきた。 Java 8u60 adds reflection on lambda param names DSLs https://t.co/cflxFK468e Hash-Literals https://t.co/5rOCrrckcB pic.twitter.com/NEzj4X3Bt1— Benjamin Weber (@benjiweber) 2015, 8月 16 曰く Java8u60でラムダのパラメーターの名前に対してリフレクションができるようになってるよ というわけで 早速、件のツイートにあったレポジトリーをダウンロードして(mavenレポジトリーにはない…(´・ω・`))、プロジェクトに追加して、試してみた。 コード import com.benjiweber.typeref.NamedValue; import java.util.Col
// (1, 2, 3, 4, 5, 6) Seq.of(1, 2, 3).concat(Seq.of(4, 5, 6)); // true Seq.of(1, 2, 3, 4).contains(2); // true Seq.of(1, 2, 3, 4).containsAll(2, 3); // true Seq.of(1, 2, 3, 4).containsAny(2, 5); // (tuple(1, "A"), tuple(1, "B"), tuple(2, "A"), tuple(2, "B")) Seq.of(1, 2).crossJoin(Seq.of("A", "B")); // (tuple(1, 1), tuple(1, 2), tuple(2, 1), tuple(2, 2)) Seq.of(1, 2).crossSelfJoin() // (1, 2, 3, 1
こんにちは。アキバです。 ゴールデンウィークですね! 皆さんいかがお過ごしですか? 今年は間に平日が多めなので、大型連休!というよりは2回連休があるというイメージの方が強いかもしれません。 cero-tの奥さんは11連休だとか さて、前回に続いて、ParallelStreamで動かしているラムダ内で、例外が発生した場合の挙動について調べていきます。 まずは、軽くおさらいします。 以下のようなコードを書きました。 try { List<String> strArray = Arrays.asList("abc", "def", "xxx", "ghi", "jkl", "xxx", "pqr", "stu"); strArray.parallelStream().forEach(s -> { System.out.println("ラムダ開始: id=" + Thread.currentTh
ある日、 id:cero-t がJJUGの重鎮たちと話している中で、とある宿題をもらいましたとさ。 「Java8のラムダの中で例外が発生したら、どうなるんだろう?」 こんにちは、アキバです。 もう皆さんはJava8を使ってみましたか? とりあえずインストールしてみた人! ・・はーい (おまえか という冗談はさておき、 今回は、id:cero-t に代わって私が冒頭のお題を調べてみました。 1. SerialStreamで動かしたラムダで例外が発生したら まずは、小手調べにシングルスレッドの場合を見てみましょう。 検査例外が発生するようなコードをラムダに書いてみると、コンパイルエラーになります。 こんなコードです。 try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(W_FILENAME))) { // writer.
こんにちは @cero_t です。 今日のテーマは・・・ラピュタ禁止令! バルス! いや違う。ラムダ禁止令、です。 さて、なかなかの滑り出しですが、今日はただのラムダの紹介ではなく、禁止令に主眼を置いて語ります。 このエントリーは、Java Advent Calendar 2013の12/16分の投稿です。 http://www.adventar.org/calendars/145 前日は @sugarlife さんの JDK 8 新機能ダイジェスト (JDK 8 Features) です。 翌日は @setoazusa さんです。 ラムダ禁止令はあり得るのか? 勉強会やその懇親会などで、たびたび「ラムダ禁止令が出るのではないか」が話題に上ることがあります。 「そりゃ禁止する組織もあるでしょうね」というのがお決まりの答えなのですが、ただそれに従うだけでは面白くありませんし、要素技術の発展も
福岡JavaOne2013報告会第2弾でのプレゼン ラムダ構文の文法よりも、その使い方とプログラミングスタイルについてを主にまとめました。
Java8にはOptionalクラスが導入されたのですが、5月にエントリを書いた時点ではモナドではありませんでした。 Java8でのプログラムの構造を変えるOptional、ただしモナドではない それが、5月末にどうもソースにモナドに必要なメソッドが追加されたらしいということになって、いつ使えるようになるか待っていたら、いつの間にか使えるようになっていました。 Optional (Java Platform SE 8 b101) こちらからダウンロードできます。 JDK8 Early Access Releases ― Project Kenai 他にもいくつか便利メソッドが追加されたおかげで、このようなコードが書けるようになりました。 String str = "abcd"; Optional.ofNullable(str) .map(st -> st.toUpperCase()) .f
←2部(ラムダ式(実質的にfinal・スコープ)〜メソッド・コンストラクタ参照) →4部(例外ジェネリクス)→5部(Tips)ここで使用されているサンプルは、lambda-8-b25-05_feb_2012に基づいて作成されています。現在の仕様とは違っている点があるかもしれませんので注意してください。 デフォルト実装 デフォルト実装とabstract デフォルト実装とインターフェースの継承 デフォルト実装と多重継承 デフォルト実装とダイアモンド継承 デフォルト実装の使いどころ 1.誰が実装しても同じような実装になるとき 2.任意のオペレーションのメソッドを定義する時 3.既存のインターフェースに新しいメソッドを追加する時 ここまでラムダ式とメソッド参照・コンストラクタ参照について見てきましたが、今回はインターフェースのデフォルト実装についてです。 デフォルト実装(別名:拡張メソッド/デフォ
Java8でlambda構文が導入されることで、Java言語も関数型のような性質をもつことになりました。 関数型の性質として大事なことのひとつに、関数を戻り値として返せるということがあります。lambda構文によって、Javaでも表記上は関数を戻り値として返すことが可能になったわけです。 で、関数を戻り値として返せるとどうなるかというと、関数をオブジェクトのように使えるようになります。まあ、Javaでは関数といっても普通のオブジェクトとして扱われるので、関数としてオブジェクトのようなものが記述できる、ということになります。 では実際に、オブジェクトのようなものを関数として記述してみます。 public static Function<String, Object> myFunc(String name, String address, LocalDate birthday){ return
Java8にlambda構文が入りましたが、これはクロージャーではない、とされています。 では、どのように「クロージャーではない」のか、ちょっと見てみます。 まず、lambdaを返すメソッドを定義します。 public static Supplier<String> createMessenger(String name, String address){ return () -> { return String.format("私は%s、%sに住んでる", name, address); }; } 呼び出すと、こんな感じでSupplierを受け取ります。 Supplier<String> messenger = createMessenger("きしだ", "ふくおか"); このSupplierを実行すると、次のようになります。 System.out.println(messenger.
Java8のlambda構文がどのようにクロージャーではないかを読んで思ったのは、ラムダの外側の変数に対する処理がスレッドセーフなのかどうかという点です。というわけで早速試してみました。 スレッドセーフでない ArrayList クラスに対して並列で値を追加するというコードです。 public void test() { Integer[] array = new Integer[100000]; Arrays.fill(array,0); List<Integer> nums = Arrays.asList(array); Stream<Integer> stream = nums.stream(); List<Integer> list = new ArrayList<Integer>(); stream.parallel().forEach(s -> list.add(s)); Sy
さて、Java8で関数型っぽいことをやって遊んでみたわけですが、実際はそんな書き方しませんよね。 Java8で実際に使うのは、Streamです。 ということで、Streamの使い方をひととおり見てみます。 ※5/17 仕様変更があったので、修正しました 基本 まずは、Iterableインタフェースに用意されたforEachメソッドを見てみましょう。 List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.forEach(s -> System.out.println(s)); これで次のように表示されます。 hoge hoge foo bar naoki kishida いままでの拡張forだと次のように書いてました List<String> names = Arrays.a
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く