プログラミングマガジン

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

  • ホーム
  • Java
  • 【Java】関数オブジェクト(Java8以降)
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

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

05.03

  • miyabisan2
  • コメントを書く

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

ここで扱う概念は、少し難解な概念なので、あせって理解する必要はありません。Javaプログラミングになれていない方は、まずはJava7までの基本構文だったり、業務で使っているライブラリやフレームワークの知識から先に学習されることをおすすめします。

Java8からですが、関数を変数に代入することが可能になりました。

構文

staticメソッドの場合

1
変数名=クラス名::そのクラスのstaticメソッド

インスタンスメソッドの場合

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

ただ、ここで注意点があります、代入したい関数の仕様に応じて、代入する変数の型が決まっているのです。

代入できる関数の条件

ある特定の引数と戻り値を持つ関数オブジェクトを格納できるのは、その引数と戻り値を持つメソッド宣言を含んだSAMインターフェイスのみ

SAMインターフェイス(single-abstract-method interface)

抽象メソッドを一つしか含まないインターフェイスのことです。

例えば、下記のようなインターフェイスを利用する必要があります。

抽象メソッドを一つしか含まないインターフェイス

1
2
3
4
5
//抽象メソッドを一つしか含まないインターフェイス
public interface Sam {
//抽象メソッド
public abstract int sum(int a,int b);
}

使い方

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Main {
 
public static int mainSum(int a,int b) {
return a + b;
}
 
public static void main(String args[]) {
Sam sam = Main::mainSum;
System.out.println(sam.sum(3, 5));
 
}
 
}

実行結果

上記のように、インターフェイスSamの中の「sumメソッド」と、代入しているMainクラスの中の「mainSumメソッド」の引数と戻り値は全く同じですよね。

代入した変数から、メソッドを呼び出す際は、インターフェイスの方の名前を使うことになります。

関数を格納するための汎用SAM

上記のように、抽象メソッドを一つ持つインターフェイスを用意すれば、関数を変数に代入することができることはわかりました。

しかし、毎回インターフェイスを作成するのは少しめんどくさいですよね。そのためにJavaでは、「java.util.function」のパッケージとして汎用的なSAMが用意されています。

名前 引数 戻り値 メソッド名
IntBinaryOperator int,int int applyAsInt
IntToLongFunction int long applyAsLong
IntToDoubleFunction int double applyAsDouble
IntConsumer int なし accept
IntSupplier なし int getAsInt
IntPredicate int boolean test

 

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

関連記事

  1. 2018 05.03

    【Java】列挙型(enum)について

  2. 2018 05.04

    【Maven】プロジェクトの作成方法

  3. 2018 04.22

    【Java】JDBCプログラムを理解する。

  4. 2018 05.03

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

  5. 2018 05.12

    【GoFのデザインパターン】「Decorator(デコレータ)」ってどんなパターン?

  6. 2018 05.20

    【Eclipse】検索機能の種類

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

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

返信をキャンセルする。

【Java】インナークラスについて(メンバクラス、ロー…

【Java】Javaプログラマーなら知らないと今後が危…

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 ©  プログラミングマガジン | プライバシーポリシー