HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
-
Upload
tsudaa -
Category
Technology
-
view
223 -
download
1
Transcript of HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」
を5分で振り返る
LTDD@16
@tsuda_ahr
ただし VB で (ぇ(VB = Visual Basic .NET 2010 以降)
(VB2008だと不可な文法が、恐らく含まれています)
お題1. ラムダ式とは?
2. VBでラムダ式
3. ラムダ式の何が楽しいのか?
4. LINQ ( JAVA では Stream API と呼ばれているやつ? )
5. 型推論とは?
1.ラムダ式とは?• 関数オブジェクトのことです。 #嘘 #かも
• だれがこんな名前にしたのか(汗
1.ラムダ式とは?• (数学での) 普通?の記法
f(x) = 2x
• (数学での)ラムダ記法
λ x.2x関数名 f が消えた
つまり無名関数!
関数名 f が必要になる
2.VBでラムダ式• 普通のメソッドの場合
Function f(x As Integer, y As Single) As String
Return "AAA"
End Function
2.VBでラムダ式• ラムダ式の場合
Sub Main()
Dim f = Function(x As Integer, y As Single) As String
Return "AAA"
End Function
End Sub
長い 簡単!
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
3.ラムダ式の何が楽しいのか?• g.Invoke(1, 1.2) は気持ち悪い?
C や JavaScript は g(1, 1.2) とかで呼べるじゃないですか。だからやだー?
→いや、g ってインスタンスだし…
逆にメソッド名なしでメソッド実行できるほうが気持ち悪くないです?
基本の構文ってこうよね…
変数名.メソッド名(引数,…)
→そういう意味では、関数が変数に代入できているわけではないともいえる。(かも)
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偶数を表示する
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
型推論だよ!
長くなった!(汗
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から(のはず)
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
4.LINQ• で、結局 LINQ って何?
• 集合(=Collectionや配列)を操作する関数群。
• SQLみたいなやつ。 (といっても別にRDBにアクセスするわけではない)
• 代表的なものに以下がある。• MAX
• MIN
• WHERE
• SELECT
• ORDERBY
• COUNT
5.型推論とは?• 型を推論します (そのまま --;)
Dim a = 1 ' Int32型
Dim b = 1.0 ' Double型
Dim c = a * b ' Double型
• 対応する一方 (上の例だと右辺のリテラル/演算) の型が分かれば、もう一方 (上の例だと左辺の変数) の型は自動的に決まる。
• これだけの話です。これ以上でも以下でもありません。(なんか JAVA の型推論で検索したらやけに難しい説明ばかりがヒットしたので念のため)
ということなので、JAVAなんか使うのはやめて
VBを使おう!(ぇ
ご清聴ありがとうございました
Any Question?
なにか質問あります?
付録) 一応 JAVA でのまとめ
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
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
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から(のはず)
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;
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のような存在はない。