2017-02-15 11 views
0

Я написал следующий код: ScalaКак обходить и использовать в Scala для определенной функции?

case class A(x: Int, out: List[Int]) 

    def isIn: Int => List[Int] => Boolean = 
    x => l => l.filter { _ == x }.nonEmpty 

    def filterTest4: (Int, List[A]) => List[List[Int]] = (x, a) => 
    for (l <- a; if (isIn(x)(l.out))) yield l.out 

functrion filterTest4 работает прекрасно, однако использует для & выхода, который я не очень нравлюсь, и, таким образом, хотел бы видеть другой путь. Я был бы очень доволен, если бы кто-то предложил конструктивный комментарий/ответ. Пожалуйста, будьте милы и имейте в виду, я только начал писать в Scala, может быть, 3 дня назад.

ответ

1

Я только что нашел функцию карты, которая может быть использована, как это:

def filterTest5: (Int, List[A]) => List[List[Int]] = (x, a) => 
    a.filter { a2 => isIn(x)(a2.out) }.map { a2 => a2.out } 

Я думаю, что делает работу.

+0

Правильно, каждое выражение for-yield может быть заменено на использование 'map',' flatMap' и 'filter'. –

+1

BTW, более сжатой версией вашего решения будет: 'a.map (_. Out) .filter (isIn (x))' –

+1

Напоминание: 'collect' объединяет' filter' и 'map':' a .collect {case a2 if isIn (x) (a2.out) => a2.out} ' – Bruno

1

В качестве альтернативы, вы можете использовать collect, который сочетает в себе map и filter. Также вы можете разрушить класс case для прямого доступа к out.

def filterTest5: (Int, List[A]) => List[List[Int]] = (x, a) => a.collect { 
    case A(_, out) if isIn(x)(out) => out 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^