2016-11-04 2 views
0
val LIST = scala.collection.mutable.MutableList[String]() 
    val filterF = new Function[Path, Boolean] { 
    def apply(x: Path): Boolean = { 
     println("looking into " + x) 
     val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
     println("considered " + x) 
     LIST += x.toString 
     return true 
     } else { 
     println("NOT considered " + x) 
     return false 
     } 
     return flag 
    } 
    } 

Я пытаюсь обновить внешнюю переменную LIST внутри функции filterF. Но проблема в том, что после строки println("looking into "+x) остальная часть кода недостижима.недостижимый код в Скале

val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
     println("considered " + x) 
     LIST += x.toString 
     return true 
     } else { 
     println("NOT considered " + x) 
     return false 
     } 
     return flag 

Я не могу понять, почему этот код недоступен. Есть ли какой-нибудь символ в коде, который на самом деле является причиной этого?

+0

Вам действительно нужно отформатировать код лучше. Эти пробелы - это боль, которую нужно читать. – Carcigenicate

+0

Юмор меня; вы пробовали «System.out.println (« глядя в «+ x»)? –

+0

Пожалуйста, выньте каждую точку с запятой в свой скрипт и вставьте ее снова. Один оператор = одна строка – Tim

ответ

2

Не используйте возврат товара

При использовании return контроль исполнения оставит функцию и весь код после оператора возврата не будет достижимым

код после возврата будет недоступен

В случае, если выражение

def bar: Int = { 
    if (true) { 
    return 1 
    } else { 
    return 2 
    } 
    1 + 2 //unreachable 
} 

В обратном заявлении Scala является обязательным и не рекомендуется, так как его не рассматривать функциональную практику кодирования.

Значение последнего выражения в кодовом блоке - это возвращаемое значение в Scala. Так что не беспокойтесь о явном возвращении просто оставить его в программу

val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
    println("considered " + x) 
    LIST += x.toString 
    true //removed return 
    } else { 
    println("NOT considered " + x) 
    false // removed return 
    } 

останавливая программу выполняющейся, бросая исключение или путем возврата значения или явный вызов выхода не работает способ делать вещи. К сожалению, Scala это позволяет. Но если вы хотите быть хорошим гражданином функционального мира. Лучше избегай этого.

Избегайте изменяемые коллекции

Используйте mutable коллекции, если у вас есть сильная потребность в нем. Имеются преимущества immutable коллекции

1) Они являются потокобезопасными.

2) Исправлена ​​ошибка (без сюрпризов случайными мутациями и без блокировки).

3) Ссылочная прозрачность.

4) Разумная производительность.

Использовать список immutable вместо mutable.

Использование Scala лямбда обозначения и синтаксический сахар

синтаксический сахар там по причине. Синтаксический сахар снижает код шаблона. Чтобы ваш код выглядел ясным, чище и лучше. Помогает в ремонтопригодности кода. Код остается без ошибок в течение более длительного времени.

Вместо Function1 признак использование лямбда обозначения.

scala> val f = new Function1[String, String] { def apply(str: String): String = str} 
f: String => String = <function1> 

scala> val f = {str: String => str} 
f: String => String = <function1> 

Так что ваш код становится

val paths = List[Path]() //assume you have Paths in it. 

val filter = {path: Path => path.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis } 

val resultList = paths.filter(filter) 
2

Это вызвало flag является вал не Защиту, но ваше заявление использует return вернуть истинный или ложных. ключевые слова return предназначены только для метода не для функции.

Правильный путь, возможно, нравится:

val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
    println("considered " + x) 
    LIST += x.toString 
    true 
} 
else { 
    println("NOT considered " + x) 
    false 
} 
Смежные вопросы