Как объединить фильтр и карту в scala?

У меня List[Int] в Scala. Список List(1,2,3,4,5,6,7,8,9,10). Я хочу filter список, чтобы он имел только четные числа. И я хочу muliply числа с 2. Возможно ли это?

Надеюсь, я ясно объяснил этот вопрос. Если у вас есть вопросы, пожалуйста, спросите. Заранее спасибо.

Ответы

Ответ 1

Как я заявляю в своем комментарии, collect должен делать то, что вы хотите:

list.collect{
  case x if x % 2 == 0 => x*2
}

Метод collect позволяет вам указать критерии для соответствующих элементов (filter) и изменить значения, соответствующие (map)

И как предложил @TravisBrown, вы можете использовать flatMap, особенно в ситуациях, когда условие более сложное и не подходит в качестве условия охраны. Что-то вроде этого для вашего примера:

list.flatMap{
  case x if x % 2 == 0 => Some(x*2)
  case x => None
}

Ответ 2

A для понимания (которое внутренне разворачивается в комбинацию map и withFilter) следующим образом:

for (x <- xs if x % 2 == 0) yield x*2

А именно

xs.withFilter(x => x % 2 == 0).map(x => x*2)

Ответ 3

Как сказал @cmbaxter, сбор идеально подходит вам. Другая приятная вещь о сборе заключается в том, что она выводит результат в случае, если вы фильтруете по классу:

scala> trait X
// defined trait X

scala> class Foo extends X
// defined class Foo

scala> class Bar extends X
// defined class Bar

scala> val xs = List(new Foo, new Bar, new Foo, new Bar)
// xs: List[X] = List([email protected], [email protected], [email protected], [email protected])

scala> xs.collect { case x: Foo => x }
// res1: List[Foo] = List([email protected], [email protected])

В паре фильтр не может быть таким умным (см. List[Foo] vs List[X]):

scala> xs.filter { case x: Foo => true; case _ => false }
// res3: List[X] = List([email protected], [email protected])

Ответ 4

Это должно сделать для вас работу:

Сначала фильтруйте, когда условие p % 2 == 0 (для получения только четных чисел).

И затем используйте map, чтобы умножить эти четные числа на 2.

var myList = List(1,2,3,4,5,6,7,8,9,10).filter(p => p % 2 == 0).map(p => {p*2})

Ответ 5

Я предпочитаю подход к фильму.

val list1 = List(1,2,3,4,5,6,7,8,9,10)
list1.filter(x => x%2 == 0).map(_*2)