Ответ гораздо лучше, чем использование spliteratorUnknownSize
напрямую, что также легче и дает лучший результат. Iterable
имеет метод spliterator()
, поэтому вы должны просто использовать его для получения вашего разделителя. В худшем случае тот же код (реализация по умолчанию использует spliteratorUnknownSize
), но в более общем случае, когда ваш Iterable
уже является коллекцией, вы получите лучший разделитель и, следовательно, лучшую производительность потока ( возможно, даже хороший параллелизм.) Его также меньше кода:
StreamSupport.stream(iterable.spliterator(), false)
.filter(...)
.moreStreamOps(...);
Как вы можете видеть, получение потока из Iterable (см. Почему Iterable & lt; T & gt; не предоставляет поток () и parallelStream ()? ) не очень болезненна.
Как насчет того, чтобы быть агностиком? Один маршрут, вы тестируете параметр, затем возвращаете правильный результат.
Route::get('/{pageOrCountry}',function($pageOrCountry){
$page = App\Page::find($pageOrCountry);
if($page) return $page;
else $country = App\Country::find($pageOrCountry);
if($country) return $country;
else return redirect('404');
});
Есть несколько способов, которые я упомяну двумя способами:
1- Привязка модели маршрута: функция создания внутри контроллера страницы
public function view(Page $page){
}
эта функция вернет не найденный, если страница не существует
2- Нормальная проверка:
public function view($page){
$check= Page::find($page);
if(!$check) abort(404);
}
создать папку resources / views / errors / 404.blade.php и определить сообщение об ошибке 404