有一個網址列表,如:查找列表中的適當第一項通過檢查它只有一次,並返回檢查結果
val urls = List("http://....", "http://....", "http://....", "http://....", ...)
某些網址無法訪問,有的人會返回狀態404
,500
等
而且我可以檢查一個網址可訪問,也有狀態代碼200
,並獲得ContentType
以及一個功能。該功能相當昂貴,因爲它將訪問網絡並且讀取超時時間爲10秒。
case class GoodSite(url:String, contentType: String)
def checkUrl(url:String): Option[GoodSite] = {
// visit the url, and get the response status code and content type
if(responseCode==200) Some(GoodSite(url, contentType))
else None
}
現在我想通過一個從列表中的一個檢查URL,並且只得到第一個將返回代碼200,然後返回內容類型。
我有兩個解決方案:
urls.flatMap(checkUrl).headOption
和
urls.find(url => checkUrl(url)!=None).map(checkUrl(_))
但他們兩人都不好,因爲他們將執行checkUrl
功能的一些不必要的電話。
有沒有什麼好的解決方案可以只調用一次?
我認爲'find'是如何工作的。你如何確認它執行'checkUrl'的不必要調用? – Kabie
你可以看到在第二個解決方案中有兩個'checkUrl'調用,但只有第一個足以獲得我想要的所有信息。 – Freewind