Как объединить фильтр и карту в 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)