プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Java
  • 【Java】Javaプログラマーなら知らないと今後が危うい!?ラムダ式をわかりやすく解説(…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Java】Javaプログラマーなら知らないと今後が危うい!?ラムダ式をわかりやすく解説(Java8以降)

05.03

  • miyabisan2
  • コメントを書く

この記事は3分で読めます

Javaには、クラスの宣言とインスタンス化を同時に行うことができる「匿名クラス」という文法が存在するとご紹介させて頂きました。

【Java】インナークラスについて(メンバクラス、ローカルクラス、匿名クラス)

また、Java8からは、下記の記事で解説させて頂きました通り、「関数オブジェクト」を使えば変数に関数を代入できると学びました。

【Java】関数オブジェクト(Java8以降)

これらの技術の応用技術として、Java8から使うことができる「ラムダ式」という技術をご紹介させていただきます。

「ラムダ式」を理解するには、「匿名クラス」と、「関数オブジェクト」の理解が必須ですので、まだ理解されていない方は、先にそちらを理解しましょう。

実際にラムダ式を使って見ましょう。

下記のようになります。

サンプル

1
2
3
4
5
6
public class Main {
public static void main(String args[]) {
IntBinaryOperator ramda = (int a,int b) -> {return a + b;};
System.out.println(ramda.applyAsInt(2,4));
}
}

実行結果

解説

IntBinaryOperator ramda = (int a,int b) -> {return a + b;};

「IntBinaryOperator」は、関数オブジェクトのご説明で登場した、int型の引数を2つ取り、int型の戻り値を1つ返す抽象メソッドを持つ、インターフェイスですね。

関数オブジェクトでは、下記の構文を使って、「IntBinaryOperator」型の変数にメソッドを代入するとご説明しましたが、今回は「(int a,int b) -> {return a + b;};」という式を代入しています。(この->が「ラムダ式」です。)

1
変数名 = インスタンス変数名::そのインスタンスのメソッド名

このクラスの作成と、インスタンス化を同時に実施しているのが、「匿名クラス」と似た仕組みですよね。

ramda.applyAsInt(2,4)

後は、「IntBinaryOperator」の抽象メソッドである、applyAsIntを使って、上記で宣言した「引数の一つ目と二つ目を足し算する処理」の結果を得ています。

ラムダ式の省略記法

引数の型を省略できる。

例えば、下記のように省略が可能です。

1
IntBinaryOperator ramda = (a,b) -> {return a + b;};

戻り値が一つだけの場合は、returnと波かっこ({})を省略できる。

1
IntBinaryOperator ramda = (a,b) -> a + b;

だいぶ、簡略化されましたね。

ラムダ式のメリット

  • インターフェイスの実装のために書かれていた記述をかなり簡略化できる。
  • 他人が、ラムダ式を使って書いていたら、理解していなければソースを読むことができない。
  • Java8になって、ラムダ式を使えることが前提のAPIが増えてきており、理解しなければ今後Javaプログラマーとして危うい。

これを見ると、何か流行に流されているだけで、イマイチメリットがないのでは?と思われるかもしれませんね。

確かに、これらのメリットは、大幅にコーディングを楽にしてくれるというものではなく、理由も少し後ろ向きのような気がします。

ただ、実際に効果を発揮するのは、同じくJava8から導入されたStreamAPIを使う時です。

StreamAPI

Java8以降で使える文法になりますが、StreamAPIというものをご紹介させて頂きます。

StreamAPIは、従来からある「InputStream」や「OutputStream」とは全く別物なので、注意しましょう。

前回の記事でラムダ式をご紹介させて頂きましたが、ラムダ式が真価を発揮するのは、StreamAPIで、コレクションや、配列に対して一括処理をする場合になります。

実際に使ってみる。

StreamAPIを使う前のリスト処理

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
 
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("test");
list.add("test1");
 
for(String li:list) {
System.out.println(li);
}
}
}

StreamAPIを使った後のリスト処理

1
2
3
4
5
6
7
8
9
10
11
public class Main {
 
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("test");
list.add("test1");
 
list.stream().forEach(li -> System.out.println(li));
 
}
}

非常に、シンプルにループ文を記述できていることがわかりますね。

解説

Java8からは、ArrayListやHashSet等の「java.util.Collection」に属しているクラスは、全て「stream()メソッド」を持つようになりました。

streamメソッド

コレクションの各要素に、一括で処理を行ったりできる等のStreamのインスタンスを得ることができます。

forEachメソッド

Streamインスタンスの代表的メソッドの一つです。

一つの関数オブジェクトを受け取り、コレクションの各要素に、関数を実行してくれます。

まとめ

今回、ご紹介させて頂いたのは、StreamAPIのほんの一例です。

他にも、非常に多くのAPIがあるので、興味のある方は勉強してみて下さい。

個人的には、最新のJava8に対応したOracle JavaプログラマーのGold試験で、非常に多くのラムダ式や、Stream APIに関する問題が出題されるので、極めたい方はチャレンジしてもいいかもしれませんね。

スポンサーリンク
  • 2018 05.03
  • miyabisan2
  • コメントを書く
  • Java
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 04.30

    【Java】オブジェクト指向:カプセル化

  2. 2018 05.02

    【Java】ジェネリクス(<>)って何?使うメリット等。

  3. 2018 04.21

    【JSP】EL式について

  4. 2018 05.13

    【GoFのデザインパターン】「Proxy(プロキシ)」ってどんなパターン?

  5. 2018 05.12

    【GoFのデザインパターン】「Abstract Factory」ってどんなパターン?

  6. 2018 04.15

    【サーブレット】サーブレットフィルターの初期化パラメータについて

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Java】関数オブジェクト(Java8以降)

【Oracle】オプティマイザとは?

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー