あなたのメンタルモデルあってますか? 矢野

Post on 29-Jul-2015

1.406 Views

Category:

Engineering

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

あなたの メンタルモデル あってますか?

新しいAPIを使っていて、 そもそも理解の仕方が間違ってることに

気がついた失敗談

矢野 勉 2014/6/5 Uzabase Tech Talk

この画像は公開不可

提供

京都在住

Who?矢野 勉名前:

どこ:

なに: 株式会社シェルフという小さい会社を やってます最近 shelfmap.com というサイトを つくりました。主にClojure。

今日は

今日は

今日は

こいつの 話をします

新しいものは 試したい

Stream APIJavaへのラムダ式導入

さっさと移行するように 説得したいので

まずは自分が試してみた

いくつかの関数のうち、 戻り値が条件に マッチしたら、

その最初の戻り値を返す

課題

func1(arg) -> “ONE”!func2(arg) -> “TWO”!func3(arg) -> “THREE”

定義

(みんな大好き)

Clojureでは…

(some (fn [f] ! (when-let [r (f)]! (= \T (first r))! [#(func1 arg)! #(func2 arg)! #(func3 arg)])

-> “TWO”

Stream APIだと?

someにあたるメソッドがない

関数を適用して、最初に真となった要素そのものを返す処理

map/filter 使うしか?List<Supplier<String>> list = ! Arrays.asList(()->func1(arg), ! ()->func2(arg), ! ()->func3(arg));!list.stream()! .map(f -> f.get())! .filter(v -> v.charAt(0) == ’T')! .findFirst();

-> Optional(“TWO”)

これでいいの?

3つのfuncがmap()で 全て評価されてしまうような…

これでいいの?

3つのfuncがmap()で 全て評価されてしまうような…

されません!

なぜそう思ってしまったか想定してた

メンタルモデル(認識の形)が 間違っていた

なぜそう思ってしまったか想定してた

メンタルモデル(認識の形)が 間違っていた

根底が間違ってるのでそのあと 全部間違う

findFirst()

当初のモデル

func1 func2 func3

結果1 結果2 結果3

結果2

結果2

map()

filter()

だって数学だとこうだし…

mapping(写像)

実際のモデル

func1

func2 func3

findFirst()

map()

filter()

結果1

実際のモデル

func1

func2 func3

findFirst()

map()

filter()

結果1全体がイテレータになっていて 評価は必要な回数だけ行われる

詳しくは

java.util.Spliterator インタフェース

まとめ

メンタルモデル大事

top related