Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
あなたの 
メンタルモデル 
あってますか? 
新しいAPIを使っていて、 
そもそも理解の仕方が間違ってることに 
気がついた失敗談 
矢野 勉 
2014/6/5 Uzabase Tech Talk 
この画像は公開不可
提供
京都在住 
Who? 
名前: 矢野 勉 
どこ: 
なに: 株式会社シェルフという小さい会社を 
やってます 
最近 shelfmap.com というサイトを 
つくりました。 
主にClojure。
今日は
今日は
今日は 
こいつの 
話をします
新しいものは 
試したい
Stream API 
Javaへのラムダ式導入 
さっさと移行するように 
説得したいので 
まずは自分が試してみた
課題 
いくつかの関数のうち、 
戻り値が条件に 
マッチしたら、 
その最初の戻り値を返す
定義 
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)])...
Stream APIだと? 
someにあたるメソッドがない 
関数を適用して、最初に真となった要素そのものを返す処理
map/filter 使うしか? 
List<Supplier<String>> list = ! 
Arrays.asList(()->func1(arg), ! 
()->func2(arg), ! 
()->func3(arg));! 
...
これでいいの? 
3つのfuncがmap()で 
全て評価されてしまうような…
これでいいの? 
3つのfuncがmap()で 
全て評価されてしまうような… 
されません!
なぜそう思ってしまったか 
想定してた 
メンタルモデル(認識の形)が 
間違っていた
なぜそう思ってしまったか 
想定してた 
メンタルモデル(認識の形)が 
間違っていた 
根底が間違ってるのでそのあと 
全部間違う
findFirst() 
当初のモデル 
func1 func2 func3 
結果1 結果2 結果3 
結果2 
結果2 
map() 
filter()
だって数学だとこうだし… 
mapping(写像)
実際のモデル 
func1 
func2 func3 
map() 
filter() 
findFirst() 
結果1
実際のモデル 
func1 
func2 func3 
map() 
全体がイテレ結果ー1タになっていて 
評価は必要な回数だけ行われる 
filter() 
findFirst()
詳しくは 
java.util.Spliterator 
インタフェース
まとめ 
メンタルモデル大事
Upcoming SlideShare
Loading in …5
×

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

No comment

  • Login to see the comments

  • Be the first to like this

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

  1. 1. あなたの メンタルモデル あってますか? 新しいAPIを使っていて、 そもそも理解の仕方が間違ってることに 気がついた失敗談 矢野 勉 2014/6/5 Uzabase Tech Talk この画像は公開不可
  2. 2. 提供
  3. 3. 京都在住 Who? 名前: 矢野 勉 どこ: なに: 株式会社シェルフという小さい会社を やってます 最近 shelfmap.com というサイトを つくりました。 主にClojure。
  4. 4. 今日は
  5. 5. 今日は
  6. 6. 今日は こいつの 話をします
  7. 7. 新しいものは 試したい
  8. 8. Stream API Javaへのラムダ式導入 さっさと移行するように 説得したいので まずは自分が試してみた
  9. 9. 課題 いくつかの関数のうち、 戻り値が条件に マッチしたら、 その最初の戻り値を返す
  10. 10. 定義 func1(arg) -> “ONE”! func2(arg) -> “TWO”! func3(arg) -> “THREE”
  11. 11. (みんな大好き) Clojureでは… (some (fn [f] ! (when-let [r (f)]! (= T (first r))! [#(func1 arg)! #(func2 arg)! #(func3 arg)]) -> “TWO”
  12. 12. Stream APIだと? someにあたるメソッドがない 関数を適用して、最初に真となった要素そのものを返す処理
  13. 13. 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”)
  14. 14. これでいいの? 3つのfuncがmap()で 全て評価されてしまうような…
  15. 15. これでいいの? 3つのfuncがmap()で 全て評価されてしまうような… されません!
  16. 16. なぜそう思ってしまったか 想定してた メンタルモデル(認識の形)が 間違っていた
  17. 17. なぜそう思ってしまったか 想定してた メンタルモデル(認識の形)が 間違っていた 根底が間違ってるのでそのあと 全部間違う
  18. 18. findFirst() 当初のモデル func1 func2 func3 結果1 結果2 結果3 結果2 結果2 map() filter()
  19. 19. だって数学だとこうだし… mapping(写像)
  20. 20. 実際のモデル func1 func2 func3 map() filter() findFirst() 結果1
  21. 21. 実際のモデル func1 func2 func3 map() 全体がイテレ結果ー1タになっていて 評価は必要な回数だけ行われる filter() findFirst()
  22. 22. 詳しくは java.util.Spliterator インタフェース
  23. 23. まとめ メンタルモデル大事

×