IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.
Java 8 Lambdas: Pragmatic Functional Programming (English Edition) 作者:Richard Warburton出版社/メーカー: O'Reilly Media発売日: 2014/03/18メディア: Kindle版 前回 blog1.mammb.com からの続き Stream Stream は複雑なコレクション操作を関数型アプローチで構築するツールです。 外部あるいは内部の繰り返し ロンドン出身のアーティスとを数える旧来のコード int count = 0; for (Artist artist : allArtists) { if (artist.isFrom("London")) { count++; } } 繰り返し処理の抽象である Iterator を使ったコード int count = 0; Iterator<Ar
JDK8およびJDK8u20では、GCログに関連する2つの便利な機能が追加されている。いずれの機能も2014/8現在最新のJDK7 update 67 には含まれていないが、JDK7u80にてバックポートされる予定。 GCログにpidと日付を含める (JDK8より) JAVA_OPTS="$JAVA_OPTS -Xloggc:/var/log/wildfly/gc_%p_%t.log" => 実際のファイル名例 : gc_pid31455_2014-08-31_14-20-16.log.0GCログのフォーマットに%pを入れるとpid形式のプロセスIDが付与される。また%tを付与すると"_2014-08-31_14-20-16"のようにGCログファイルを作成した日付時分秒が追加される。かつてGCログはJavaを再起動すると同じファイルが上書きされて消えてしまうため、出力先を-Xloggc:g
Java SE 7で導入されたNIO2のFilesクラスでreadAllLinesメソッドを使って大きなファイルを読むと、ヒープメモリを圧迫またはOutOfMemoryErrorを起こします。 List<String> lines = Files.readAllLines(Paths.get(args[0]), StandardCharsets.UTF_8); Windows 7 64bit(12GBメモリ)で、Java SE 8 64bit版上でヒープメモリサイズのオプションを指定せずに(デフォルト)実行し、8GBのファイルを上述コードで読み込ませたところOutOfMemoryErrorが発生しました。 Java SE 8で導入されたStream APIを使って大きなファイルを読み込むとどうか試してみました。 try (BufferedReader reader = Files.newB
Java SE 8 Development Kit(JDK 8)で新たに搭載されたコマンドjdepsは、JavaのクラスファイルやJARファイルから、JARファイルやパッケージやクラスの間の依存関係を解析します。ツールの結果はテキスト(標準出力)とdot形式ファイル(Graphvizでグラフィカルに表示)として生成できます。 http://docs.oracle.com/javase/8/docs/technotes/tools/unix/jdeps.html 今回は、JARファイル間の依存関係をjdepsコマンドで調べてみました。 GeoToolsのJARファイルの依存関係を調べる Javaのオープンソース地図ライブラリGeoToolsは、多数のJARファイルから構成されています。 http://www.geotools.org/ 次にGeoTools 11.1に含まれるJAR一覧を示し
昨日はJava読書会BOF主催のJava読書会「Java 8 Lambdas」を読む会の第2回を開催しました。洋書にも関わらず、10人を超える参加者が集まりました。 今回の読書範囲で感じたことなど ラムダ式の引数命名 ラムダ式の記述で、引数の変数名に著者は多少長くなっても意味を示す名前を付けています。 Example 3-16より引用 int count = Stream.of(1, 2, 3) .reduce(0, (acc, element) -> acc + element); たまにラムダ式の解説でみかける1文字変数のコード例だと int count = Stream.of(1, 2, 3) .reduce(0, (a, e) -> a + e); と短くなるものの、'a'って? 'e'って? となって可読性が下がります。 for文、分かりやすいではないか 上記のreduceを使っ
Mockit.setUpMock(HogeMock.class); // ここでいねーよってコンパイラーさんがOKOKO new Expectations() { Fuga fuga; // これではMock化してくれないっぽい? { this.fuga = new Fuga(); // 動かすとMockじゃないってJVMがOKOKO } }; どうやら、基本的にMockUp使えってことらしくて、Expectitionsはテストクラスのフィールドやメソッドの引数にMockedアノテーション付ける以外にはダメっぽそう。 TestNG+jMockit+EclEmmaな環境だと、EclEmma2.3.1とかにしてしまうだけで、jMockitとぶつかって、テストの起動でコケてくれるので、jMockitのバージョンを上げるか、EclEmmaを2.2系に戻すほかないけど、Java8対応とかするにはEc
The Checker Framework Manual: Custom pluggable types for Javahttps://checkerframework.orgVersion 3.49.4 (2 Jun 2025) For the impatient: Section 1.3 describes how to install and use pluggable type-checkers. This manual is also available in PDF. Contents Chapter 1 Introduction 1.1 How to read this manual 1.2 How it works: Pluggable types 1.3 Installation 1.4 Example use: detecting a null pointer b
今回も前回の記事につづき、Java8による変更点で未だあまり紹介されていないポイントを記事にしようと思う。 今回はJava8のHotSpotVMの話。Java8ではJEP122が取り込まれ、VMのメモリモデルが変更された。JEP122のタイトル「Remove the Permanent Generation」から想像できるとおり、Java8のHotSpotVMからは従来のPermanent領域が無くなった。 なぜ、こういった変更が行われたのだろうか?また、元々Permanent領域に格納されていた情報は何処にいってしまったのか?JVM付属のツールにどういった影響があるのか? 今回の記事ではこの点をまとめていこうと思う。 なお、HotSpotVMのメモリモデルについて詳しくない方は、先にこちらの項番(「補足 – HotSpotVMのメモリ構造概説)を読んでいただくとスムーズに読み進められるだ
2014年3月18日、ついにJava8が正式にリリースを迎えた。 折角なので、今後、Java8の新機能に関する記事をいくつかアップしていきたい。 Java8といえばやはりラムダ式だけど、既に色々な方がブログ等々で紹介しているので、今回は、Java8にて導入されたインタフェースのデフォルト実装と多重継承、Mix-inの関係について書いていきたいと思う。 かなり長丁場になりそうだが、最後までお付き合いいただければ幸いである。 では、Java8の世界に飛びだそう! Java8のインタフェース実装とは? Java8では、インタフェースに実装を持てるようになった。 定義の方法は「default」句、または「static」句を利用する2パターンが存在する。 今回の記事では「default」句を利用した場合のメソッドの振る舞いから多重継承とmix-inについて考えていく。 default句を使用したイン
java.lang.Object#hashCode()の性質という記事で書いたのですが、Java の Object#hashCode() の値はただの乱数となっています。 この乱数のアルゴリズムが、Java SE 8 で「線形合同法」から「XORシフト方式」に変更になっていました。 といっても、変更されたのはたった1文字。 VMオプションのデフォルト設定が -XX:hashCode=0 から -XX:hashCode=5 に変わっただけでした。 hotspot-rt Udiff hotspot/src/share/vm/runtime/globals.hpp どういうこと? もともと、Java の以前の実装*1 *2から、Object#hashCode() のアルゴリズムはVMオプション -XX:hashCode=? で選べるようになっていました。 ですが、デフォルトは長いこと 0(=線形
Java SE 8 が日本時間の 3 月 19 日 午前 4 時頃にリリースされました。3 月 18 日リリースと聞いて JDK ダウンロードページが更新されるのを待機していたけれども、いつまで経っても更新されず、翌日見てみたら更新されていた、という経験をされた方も少なくないのではないでしょうか。今回は Java SE 8 のリリースがなぜ 3 月 18 日でなく 3 月 19 日になってしまったのか?という謎解きも含めて、「時」というものを振り返ってみようと思います。 1. 「時」の基本単位は「秒」 現在、「時」の基本単位は「秒」と定められています。「秒」は 7 つある SI 基本単位 (これ以上分解できない単位のこと) の 1 つであり、SI 単位系においては非常に重要な存在です。 SI 基本単位は、m (メートル; 長さ)、kg (キログラム; 質量)、s (秒; 時刻・時間)、A
各技術の注目度・実用度を分析したTechnology raderというのを、Thought worksが半年ごとに発表してます。 で、これいつもJava嫌いなんだなーって思う感じの内容だったんですね。 たとえば、2011年1月には「Java language end of life」といって、JavaはVMは残るけど言語は終わるよねーみたいな感じになってました。 http://thoughtworks.fileburst.com/assets/technology-radar-january-2011.pdf これが、2011年7月では、「Future of Java」として、今後でてくるJavaなら評価していいんじゃねーのみたいに。 http://thoughtworks.fileburst.com/assets/technology-radar-july-2011.pdf そして、先日
Java8 Stream API では collector とかを複数回呼ぶと実行時エラーになる 以下のようなコードは、実行時エラーになる。 Stream<String> ss = Arrays.asList("hoge", "fuga").stream(); System.out.println(ss.count()); System.out.println(ss.count()); スタックトレースは以下のようになる。 stream has already been operated upon or closed java.lang.IllegalStateException at java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203) at java.util.stream.LongPipeline.<i
夏のJAWS-UG 三都物語 2014というイベントで「そろそろJavaみなおしてもええんやで」というプレゼンしてきました。 Javaのイベントではなかったので、Javaを使ってない人を想定したプレゼンでしたが、実際会場のほとんどがJavaメインではなかったようです。 for(int num : nums){ if(num > 10) continue; sum += num * 2; } というコードが、NetBeansの「関数操作を使用」というリファクタリングで sum = nums.stream().filter((num) -> !(num > 10)).map((num) -> num * 2).reduce(sum, Integer::sum); になったところがハイライト。 ここまでできるとは思ってなかった。 そろそろJavaみなおしてもええんやで from なおき きしだ
毎年 6 月恒例の Eclipse メジャーリリースとなる Eclipse 4.4 Luna (ルナ) がリリースされた。ラムダなど Java 8 に正式対応した初のバージョンだ。これに合わせて日本語化された Eclipse と便利なプラグインや Java 8 実行環境を含む全部入りの Pleiades All in One もリリースした。 Pleiades All in One Eclipse 4.4 Luna ダウンロード http://mergedoc.sourceforge.jp/pleiades_distros4.4.html 起動時のスプラッシュは月食 (Lunar Eclipse) のときに月から地球を見たときに発生しているであろう日食イメージにした。地球の所々光っている部分は実際の街明かりで、韓国の北側の国が真っ暗で話題になった NASA の映像。背景は銀河中心方向の S
WEB+DB PRESS の Vol.81 から JVM を中心とした連載を始めましたので是非買って下さい。 2014/6/24 発売です。書店には既に並んでいるかと思います。 これはアマゾンのアフィリエイトリンクですので、踏んだ直後に冷蔵庫等の大型家電を購入して頂けると僕が喜びます。 電子書籍版もありますので物理的な媒体に興味がない方は PDF を買って下さい。 WEB+DB PRESS Vol.81@Gihyo Digital Publishing 初回の内容はラムダ式 + RxJava 今回の内容としては Java8 のラムダ式に関する簡単な説明から、ラムダ式を利用してRxJavaを使うとこんなに便利という話を書きました。 記事内で Stream API に関して説明しなかった最大の理由はラムダ式と Stream API に関する適切で妥当な説明については桜庭さんの記事を読めば良い
Java6までは、Javaでファイルエンコーディングの変換を行おうとすると、Readerで開いて一行ずつ読み込みながらWriterで書き込むみたいなコードが必要になってました。 これはJava7のnioで導入されたファイルユーティリティで簡単に書けるようになったのですが、フォルダ以下のファイルをすべて処理しようとすると再帰コードを書く必要があったりして面倒でした。 ※追記 7/9 コメントで指摘あるように、walkFileTreeを使うと再帰書かずにファイルツリーの処理ができました。walkだとStreamになって便利、という感じですね。 でも、Java8ではファイルユーティリティにフォルダ以下のファイルをすべて処理するためのwalkメソッドが追加されているので、すべてのファイルを処理するということも楽になりました。 ということで、指定フォルダ以下のファイルのすべての文字コードをWindo
本日は日本Javaユーザーグループ(JJUG)主催のクロスコミュニティカンファレンス2014春に参加してきました。今日の日記は、参加内容のまとめではなく、参加して得たことやそれをきっかけに考えたことなどをだらだらと書き連ねます。 Java SE 8では、forEach書いたら負け、for文禁止 日記のタイトルは、午前のセッション「K-1 詳説 Java SE 8 – CCC Edition」で出た話題です。手続き的なロジックを書いて、ネストが深く制御構造が複雑になってしまう人向けにはJava SE 8で導入されたラムダ式とStream APIを使って、内部イテレータと関数型プログラミングのエッセンスを取り入れた書き方をするといいよ、という話から出た言葉です。 実は昨日開催したJava読書会(「Java 8 Lambdas」を読む会)でも、「for文は禁止だ!」という話題が出てました。for
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く