読者です 読者をやめる 読者になる 読者になる

エンタープライズギークス (Enterprise Geeks)

企業システムの企画・開発に携わる技術者集団のブログです。開発言語やフレームワークなどアプリケーション開発に関する各種情報を発信しています。ウルシステムズのエンジニア有志が運営しています。

Java8超入門 - for文の代わりにStreamを使おう(3)

前回の記事では、Stream APIのfilterメソッドを使って、集合データから条件に合致する要素を抽出する方法を紹介した。 今回は集合データ内の要素を変換するmapメソッドを紹介する。 これまでと同様に、シンプルなPersonクラスを利用する。 public class Pers…

Java8超入門 - for文の代わりにStreamを使おう(2)

だいぶ間が空いてしまったが、Java8の超入門記事の第2回である。 前回の記事では、forループの代わりにStream APIのanyMatchメソッドを使って、コレクション全体に対する条件判定を行う方法を紹介した。 今回は、コレクションから条件に該当する要素を抽出す…

Java8勉強会を開催しました

先日告知したとおり、10月25日にJava8勉強会を開催しました。 休日にもかかわらず多くの方に参加いただき、ありがとうございました。 当日使用した資料は誤字などを修正したうえで公開しました。 Java8勉強会 from Kentaro Maeda また、演習問題もgithubで公…

Java8超入門 - for文の代わりにStreamを使おう(1)

今年の3月にリリースされたJava8では、関数型インターフェース、ラムダ式、Stream、Optionalなど、関数型言語の仕組みが導入された。 このブログでも、これまでJava8の新機能の解説記事をたくさん書いてきたが、具体的にどんな場面で使えばいいのだろう、と…

Java8勉強会を開催します

勉強会ネタが続きますが、10月25日(土)の13時から17時まで、弊社オフィス(東京都中央区晴海)でJava8の勉強会を行います(参加費は無料)。 トップアーキテクトが伝授する!最新IT技術勉強会 「これだけは押さえておきたいJava8の新機能」 以下はセミナーの…

Stream APIの拡張(2) - 委譲方式による拡張

前回の記事では、Stream APIを拡張する方法として、特殊な性質を持つStreamを生成する方法を紹介した。 今回は、委譲を使ってStreamを拡張する方法を紹介する。 委譲によるStream APIの拡張 委譲を使ってStreamを拡張する場合、元のStreamを内部に保持するSt…

Stream APIの拡張(1) - 生成処理の拡張

Stream APIには、他の言語の同様の機能(すなわちHaskellのリスト([])やScalaのコレクション、C#のLINQなど)と比較すると、存在しない機能がいくつかあり、その中には有用なものがある。 以前の記事で紹介したzipもその中の一つだ。 今回は、HaskellやSca…

Template Methodパターンの実装あれこれ

Template Methodは、GoF (Gang of Four) のデザインパターンの1つで、処理の共通部分をスーパークラスに抽出し、固有の処理をサブクラスで実装することで、最適なアプリケーション構造にするパターンである。 今回は、Java7およびJava8におけるTemplate Meth…

Java8の基本 - 遅延処理

本稿では、Java8における遅延評価のサポートについて紹介する。 遅延評価とは、ある値に対する計算処理を、実際にその値が必要になった時点で行うことであり、関数型言語が一般的にサポートする仕組みである。 Java8では、Stream APIにおいて遅延評価を局所…

Java8の基本 - Optional型

前回まではStreamクラスを解説してきたが、今回はJava8が提供するもう1つの関数型プログラミングの機能であるOptionalクラスを紹介する。 Optional型 Optionalは存在するかもしれないT型の値を1つ保持するクラスである。 (OptinalInt, OptionalDoubleなど、…

Java8 Stream APIの基本(8) - 終端操作3(close)

Stream APIの最終回として、使用頻度は少ないと思われるが、Stream#closeについて述べる。 Stream#close StreamはAutoCloseableを実装しているため、closeメソッドも存在する。 (正確には Stream のスーパーインターフェースのBaseStreamで実装されている)…

Java8 Stream APIの基本(7) - 終端操作2(Stream#collect)

今回はStream#collectの内部構造の概要を紹介する。 以前の記事では、Streamで加工したデータをList等のデータ構造に変換する際にcollect(Collectors.toList())のようなコードを書いた。 しかしStream#collectはStream APIの汎用的な終端操作であるため、Lis…

Java8 Stream APIの基本(6) - 終端操作の概要

今回から、3回に分けてJava8 Stream API の終端操作について解説する。 終端操作は Stream の中の要素を実際に処理をする工程であり、fliter 等の中間操作は終端操作をトリガーにして初めて実行される。 中間操作を適用した要素に対して、終端操作で処理し、…

Java8 Stream APIの基本(5) - zip の実装

先日のStream APIの基本(4)では Spliteratorについて解説したが、2つのリストを扱う方法やインデックスアクセスの方法については記述しなかった。 またStream APIの基本(2)では、 並列処理では2つの要素から順番に要素を取得するには工夫が必要であると述べ…

Java8 Stream APIの基本(4) - ストリームの内部

先日の記事ではStreamの基本的な生成処理について述べた。 今回はStreamの内部処理で扱われるSpliteratorについて解説する。 Spliterator Spliteratorは分割可能なイテレータであり、Streamの低レベルAPI用のインターフェースである(名前の由来はsplitとite…

Java8 Stream APIの基本(3) - ストリーム生成

ストリームの生成方法についてまとめる。 ストリームを作成するAPIはコレクションなどの既存のクラスのいくつかに追加されており、Streamのstaticメソッドにもストリームを生成する手段が提供されている。 また、Streamの要素走査の中心的な役割である Split…

Functionインタフェースに定義されている関数の合成を試してみた

Java8のFunctionインターフェースに提供されている関数の合成を試してみた。提供されている関数はcomposeとandThenの2つである。 関数の合成の処理はとても簡単だ。Java8のFunctionインターフェースの実装を見ると、処理はたった2行で実装されている。nullチ…

Java8 Stream APIの基本(2) - 中間操作の種類と並列処理、副作用

Java 8 Stream API の中間操作の種類・並列処理・それらの注意点についてまとめておく。 プリミティブ型のStream 中間操作のメソッドを見ると、mapの他に、mapToInt,mapToLong, mapToDoubleのような、プリミティブ型への変換を行うメソッドがある。 また、 S…

Java8 Stream APIを使ったピタゴラス数生成処理

先日の記事では、Stream APIの基本的な仕組みを書いた。今回はサンプルコードとして、ピタゴラス数を生成する処理をStreamで書いてみる。 ピタゴラス数とは、三平方の定理でおなじみの a * a + b * b = c * c を満たす自然数の組のことだ。 最初のピタゴラス…

ラムダ式のオブジェクトは再利用される場合がある

Java8で導入されたlambda。このlambdaのオブジェクトがどの単位でインスタンス化されるかが気になったので試してみた。 というのも、lambdaのオブジェクト生成はJavaVM側の制御に任されているため、どのような単位でオブジェクトが生成されるのか純粋に興味…

Java8 Stream APIの基本(1) - 代表的な中間操作

Java8で新たに提供されたStream APIの基本をまとめておく。 (今回は並列処理機能については割愛する。) 概要 Stream API はJava8から追加されたAPIであり、高機能な繰り返し処理を記述できる。同じくJava8から追加されたラムダ式の使用を前提としている。 …

Java8関連のリンク

Java8関連のリンクを整理してみる。[まとまった情報がある公式サイト]http://docs.oracle.com/javase/8/[What's New in JDK 8]http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html[Java8チュートリアル]http://docs.oracle.com/javase/…