編集の要約なし
 
(同じ利用者による、間の17版が非表示)
1行目: 1行目:
< [[Java基本文法]]
< [[Java基本文法]]


* ラムダ式とは、メソッドを定義することなくロジックを利用するための仕組み
* ラムダ式とは、function を定義することなく function を再利用するための仕組み
* すでに定義されたメソッドがある場合は[[機能オブジェクト]]として再利用する
* すでに定義されたメソッドがある場合は[[機能オブジェクト]]として再利用する
* そのロジックを格納するには同じ戻り値と引数を定義した[[SAMインターフェース]]を使う
* その function をの戻り値を格納するには同じ戻り値と引数を定義した[[SAMインターフェース]]を使う
  import java.util.function.*;
  import java.util.function.*;
  public class Main {
  public class Main {
19行目: 19行目:
  IntToDoubleFunction func = x -> x * x * 3.14;
  IntToDoubleFunction func = x -> x * x * 3.14;


==利用例==
====
# FuncList.java
ラムダ式では、ロジックをその場で作っているのがポイント。[[機能オブジェクト#例|機能オブジェクトの例]]と比較。
public class FuncList {
    public static boolean isOdd(int x) { return (x % 2 == 1); }
    public static String hoge(boolean male, String name) {
        if (male == true) { return "Mr." + name; }
        else { return "Ms." + name; }
    } 
}
 
  # Main.java
  # Main.java
  interface Func1 {
  interface Func1 {
37行目: 29行目:
  }
  }
   
   
  Func1 f1 = x -> x % 2 ==1;
  public class Main {
Func2 f2 = (male, name) -> {
public static void main(String[] args) {
if (male == true) { return "Mr." + name; }
    Func1 f1 = x -> x % 2 ==1;
else { return "Ms." + name; }
    Func2 f2 = (male, name) -> (male ? "Mr." : "Ms.") + name;   // ラムダ式 + 三項演算子
};
    System.out.println(f1.call(15));
// Func2 f2 = (male, name) -> (male ? "Mr." : "Ms.") + name;
    System.out.println(f2.call(true, "Smith"));
  }
  }



2019年7月8日 (月) 00:58時点における最新版

< Java基本文法

  • ラムダ式とは、function を定義することなく function を再利用するための仕組み
  • すでに定義されたメソッドがある場合は機能オブジェクトとして再利用する
  • その function をの戻り値を格納するには同じ戻り値と引数を定義したSAMインターフェースを使う
import java.util.function.*;
public class Main {
    IntBinaryOperator func = (int a, int b) -> { return a - b; };
    int ans = func.applyAsInt(5, 3);
    System.out.println("5 - 3 = " + ans);
    }
}

省略記法

  • 左オペランドで変数の型が特定される場合、ラムダ式の引数の型は省略できる
  • ラムダ式の引数が1つの場合、ラムダ式の丸カッコも省略できる
IntToDoubleFunction func =    x -> { return x * x * 3.14; };
  • ラムダ式のロジックが単一の return文の場合、return文字と波括弧も省略できる
IntToDoubleFunction func = x -> x * x * 3.14;

ラムダ式では、ロジックをその場で作っているのがポイント。機能オブジェクトの例と比較。

# Main.java
interface Func1 {
boolean call(int x); 
}
interface Func2 {
String call(boolean male, String name);
}

public class Main {
public static void main(String[] args) {
    Func1 f1 = x -> x % 2 ==1;
    Func2 f2 = (male, name) -> (male ? "Mr." : "Ms.") + name;    // ラムダ式 + 三項演算子
    System.out.println(f1.call(15));
    System.out.println(f2.call(true, "Smith"));
}

その他

// 拡張for
for (Monster monster : monsters) {
    monster.attack(sol);
}
// コレクション + Stream + ラムダ式
monsters.parallelStream().forEach(m -> m.attack(sol));
// 勇者インスタンスのHPを取り出す
(Hero h) -> { return h.getHp(); }
// 現在の日時を取り出す
() -> { return new java.util.date(); }
// long配列のコピーを作り、並べ替えたものを取り出す
(long[] arrays) -> {
    long[] newArrays = java.util.Arrays.copyOf(arrays, arrays.length);
    java.util.Arrays.sort(newArrays);
    return newArrays;
}