Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5...

HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る

tsuda.a

July 04, 2015
Tweet

More Decks by tsuda.a

Other Decks in Programming

Transcript

  1. ただし VB で (ぇ (VB = Visual Basic .NET 2010

    以降) (VB2008だと不可な文法が、恐らく含まれています)
  2. お題 1. ラムダ式とは? 2. VBでラムダ式 3. ラムダ式の何が楽しいのか? 4. LINQ (

    JAVA では Stream API と呼ばれているやつ? ) 5. 型推論とは?
  3. 1.ラムダ式とは? • (数学での) 普通?の記法 f(x) = 2x • (数学での)ラムダ記法 λ

    x.2x 関数名 f が消えた つまり無名関数! 関数名 f が必要になる
  4. 2.VBでラムダ式 • ラムダ式の場合 Sub Main() Dim f = Function(x As

    Integer, y As Single) As String Return "AAA" End Function End Sub
  5. 3.ラムダ式の何が楽しいのか? • 関数を引数に渡せるよ! Sub Main() Dim f = Function(x As

    Integer, y As Single) As String Return "AAA" End Function a(f) End Sub Sub a(g As Func(Of Integer, Single, String)) Dim s As String = g.Invoke(1, 1.2) End Sub
  6. 3.ラムダ式の何が楽しいのか? • g.Invoke(1, 1.2) は気持ち悪い? C や JavaScript は g(1,

    1.2) とかで呼べるじゃないですか。だからやだー? →いや、g ってインスタンスだし… 逆にメソッド名なしでメソッド実行できるほうが気持ち悪くないです? 基本の構文ってこうよね… 変数名.メソッド名(引数,…) →そういう意味では、関数が変数に代入できているわけではないともいえる。(かも)
  7. 4.LINQ ( JAVA では Stream API と呼ばれているやつ? ) • 従来だと…

    Dim a = {1, 2, 3, 4, 5} For Each x In a If x Mod 2 = 0 Then Console.WriteLine(x) End If Next 偶数を表示する
  8. 4.LINQ • LINQ を使うと!! Dim a = {1, 2, 3,

    4, 5} Dim b = a.Where(Function(x) If x Mod 2 = 0 Then Return True Else Return False End If End Function) For Each x In b Console.WriteLine(x) Next 型推論だよ!
  9. 4.LINQ • まあこう書けないこともない(ぇ Dim a = {1, 2, 3, 4,

    5} Dim b = a.Where(Function(x) x Mod 2 = 0) For Each x In b Console.WriteLine(x) Next ※ むしろこちらが正統。 VB2008 ではこうしか書けない。複数行記述はVB2010から(のはず)
  10. 4.LINQ • しかし、VB にはクエリ式がよく似合う。(個人的感想) Dim a = {1, 2, 3,

    4, 5} Dim b = From x In a Where x Mod 2 = 0 Select x For Each x In b Console.WriteLine(x) Next
  11. 4.LINQ • で、結局 LINQ って何? • 集合(=Collectionや配列) を操作する関数群。 • SQLみたいなやつ。

    (といっても別にRDBにアクセスするわけではない) • 代表的なものに以下がある。 • MAX • MIN • WHERE • SELECT • ORDERBY • COUNT
  12. 5.型推論とは? • 型を推論します (そのまま --;) Dim a = 1 '

    Int32型 Dim b = 1.0 ' Double型 Dim c = a * b ' Double型 • 対応する一方 (上の例だと右辺のリテラル/演算) の型が分かれば、 もう一方 (上の例だと左辺の変数) の型は自動的に決まる。 • これだけの話です。これ以上でも以下でもありません。 (なんか JAVA の型推論で検索したらやけに難しい説明ばかりがヒットしたので念のため)
  13. 3.ラムダ式の何が楽しいのか?(VB版) • 関数を引数に渡せるよ! Sub Main() Dim f = Function(x As

    Integer, y As Single) As String Return "AAA" End Function a(f) End Sub Sub a(g As Func(Of Integer, Single, String)) Dim s As String = g.Invoke(1, 1.2) End Sub
  14. 3.ラムダ式の何が楽しいのか? (JAVA版) • 関数を引数に渡せるよ! public static void main(String[] args){ BiFunction<Integer,

    Float, String> f = (x, y) -> "AAA"; a(f); } private static void a(BiFunction<Integer, Float, String> g) { String s = g.apply(1, 1.2f); } 引数が一つの時は、Function。 引数がない場合は Runnable を使用します。実行は apply(); ではなく run(); を使用します。 引数が一つだけど、戻り値がない場合は Consumer。実行は accept();です。 #なんでだよ(汗 https://docs.oracle.com/javase/jp/8/api/java/util/function/package-summary.html
  15. 4.LINQ (VB版) Dim a = {1, 2, 3, 4, 5}

    Dim b = a.Where(Function(x) x Mod 2 = 0) For Each x In b Console.WriteLine(x) Next ※ むしろこちらが正統。 VB2008 ではこうしか書けない。複数行記述はVB2010から(のはず)
  16. 4.Stream API (JAVA版) public static void main(String[] args){ List<Integer> a

    = Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> b = a.stream().filter(i -> i % 2 == 0); b.forEach(x -> System.out.println(x)); } 以下をしています import java.util.*; import java.util.function.*; import java.util.stream.Stream;
  17. 5.型推論 (JAVA版) public static void main(String[] args){ List<Integer> a =

    Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> b = a.stream().filter(i -> i % 2 == 0); b.forEach(x -> System.out.println(x)); } よって頑張って型を書く! このあたりは型推論だけど、 ・C# や JavaScript の var ・VB の Dim のような存在はない。