В Python я могу легко создать новый список по условию

list_1 = [1,2,3,4,5]
new_list = [e for e in list_1 if e>3]
# result [4,5]

Но не та же история для Скалы. Я пытался использовать метод карты

var array_1 = Array(1,2,3,4,5)
var new_array = array_1.map(e => if(e>3) e)
// result: [undefined, undefined, undefined, 4, 5]

Есть ли какая-то магия, которую я не знаю здесь? Благодарен за помощь

-1
Phước Hữu Lưu 5 Июл 2019 в 13:26

3 ответа

Лучший ответ

Попробуйте { {X0}} вот так

var new_array = array_1.filter(e => e > 3)

Какие выводы

new_array: Array[Int] = Array(4, 5)
5
Mario Galic 5 Июл 2019 в 10:29

map это просто применить метод к каждому элементу.

filter должен фильтровать каждый элемент.

Вы можете объединить их, выполнив один collect с Partial Function

Seq(0, 1, 2, 3, 4, 5).collect{
  case e if 3 < e => 2*e
}
1
BlueSheepToken 5 Июл 2019 в 12:13

Решение, предложенное @Mario, является предпочтительным способом достижения этого в Scala.

В любом случае, вы также можете достичь этого, используя для понимания, что аналогично тому, как это делается в python:

for {e <- array_1; if e > 3} yield e

Этот код десагрегируется к вызову метода filter.

3
senjin.hajrulahovic 5 Июл 2019 в 11:23