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

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

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

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

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

を5分で振り返る

LTDD@16

@tsuda_ahr

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

ただし VB で (ぇ(VB = Visual Basic .NET 2010 以降)

(VB2008だと不可な文法が、恐らく含まれています)

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

お題1. ラムダ式とは?

2. VBでラムダ式

3. ラムダ式の何が楽しいのか?

4. LINQ ( JAVA では Stream API と呼ばれているやつ? )

5. 型推論とは?

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

1.ラムダ式とは?• 関数オブジェクトのことです。 #嘘 #かも

• だれがこんな名前にしたのか(汗

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

1.ラムダ式とは?• (数学での) 普通?の記法

f(x) = 2x

• (数学での)ラムダ記法

λ x.2x関数名 f が消えた

つまり無名関数!

関数名 f が必要になる

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

2.VBでラムダ式• 普通のメソッドの場合

Function f(x As Integer, y As Single) As String

Return "AAA"

End Function

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

2.VBでラムダ式• ラムダ式の場合

Sub Main()

Dim f = Function(x As Integer, y As Single) As String

Return "AAA"

End Function

End Sub

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

長い 簡単!

Page 9: HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を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

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

3.ラムダ式の何が楽しいのか?• g.Invoke(1, 1.2) は気持ち悪い?

C や JavaScript は g(1, 1.2) とかで呼べるじゃないですか。だからやだー?

→いや、g ってインスタンスだし…

逆にメソッド名なしでメソッド実行できるほうが気持ち悪くないです?

基本の構文ってこうよね…

変数名.メソッド名(引数,…)

→そういう意味では、関数が変数に代入できているわけではないともいえる。(かも)

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

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偶数を表示する

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

4.LINQ• LINQ を使うと!!

Dim a = {1, 2, 3, 4, 5}Dim b = a.Where(Function(x)

If x Mod 2 = 0 ThenReturn True

ElseReturn False

End IfEnd Function)

For Each x In bConsole.WriteLine(x)

Next

型推論だよ!

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

長くなった!(汗

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

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から(のはず)

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

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

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

4.LINQ• で、結局 LINQ って何?

• 集合(=Collectionや配列)を操作する関数群。

• SQLみたいなやつ。 (といっても別にRDBにアクセスするわけではない)

• 代表的なものに以下がある。• MAX

• MIN

• WHERE

• SELECT

• ORDERBY

• COUNT

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

5.型推論とは?• 型を推論します (そのまま --;)

Dim a = 1 ' Int32型

Dim b = 1.0 ' Double型

Dim c = a * b ' Double型

• 対応する一方 (上の例だと右辺のリテラル/演算) の型が分かれば、もう一方 (上の例だと左辺の変数) の型は自動的に決まる。

• これだけの話です。これ以上でも以下でもありません。(なんか JAVA の型推論で検索したらやけに難しい説明ばかりがヒットしたので念のため)

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

ということなので、JAVAなんか使うのはやめて

VBを使おう!(ぇ

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

ご清聴ありがとうございました

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

Any Question?

なにか質問あります?

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

付録) 一応 JAVA でのまとめ

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

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

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

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

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

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から(のはず)

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

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;

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

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のような存在はない。