好奇在 functional 界是怎麼處理這種問題?
這種 iteration 中要做不同的 branch task (side effect) 有漂亮的解法嗎?
就原討論來看,跟 Functional programming 比較沒有關係,感覺只是想設計 Method chain 的問題,也就是將 if 判斷從程式碼中去除,或說是隱藏至 API 中。
如果真要跟 Functional programming 有關係,那麼就得考量像 filterElse、mapElse、reduceElse 之類的 API,因為每個人在迴圈中做的事不同,而且 xxxElse 可以指定的兩個任務必須是相同性質。
例如 filterElse 的話,兩個任務都要是 filter,而不能像是去做得到單一值的任務,或者是去做了 map 的動作,也就是像(也許還得加上 p1、p2、p3 這類判斷條件):
source.filterElse(p1, a, b) // a 、b都是filter,只是filter條件不同
.mapElse(p2, c, d) // c、d都是map,只是map方式不同
.reduceElse(p3, e, f); // e、f都是 reduce,只是reduce方式不同
原討論舉 foreachElse 容易讓人誤會,因為 Java 8 中 foreach 的本質就是 imperative 的。
至於 while 或 for 要不要搭 else,那太容易造成誤會,Python 中雖然有,一直以來也不建議使用,有人說那是因為 else 只會在迴圈中沒有 break 時執行,不過,改成 else 會在迴圈中有 break 時執行,或者是 else 只有在迴圈沒有執行時執行,我想都會有人有話說。
看起來作者是想要 for ... else { if no iteration }
不過看到這語法可能有人會認為是 for ... else { if any break }
而這在 python 是 for ... else { if none break }
Effective Python1 Item 12: Avoid else Blocks After for and while Loops
也許 refactor 比較增加這種語法好
for ... else
很難懂吧, else 的條件是什麼? 有沒有 break ?
for (...) {
} else if break {
}
這樣也許好一點