根据scala中的参数过滤列表

Filter a List based on a parameter in scala

我想根据特定科目过滤学生列表中的科目列表,即 "maths" 在我的例子中。

下面是定义 Student 和 Subject 的代码 class。

 case class Student(
    name:String,
    age:Int,
    subjects:List[Subject]
  )

  case class Subject(name:String)

  val sub1=Subject("maths")
  val sub2=Subject("science")
  val sub3=Subject("english")
  val s1=Student("abc",20,List(sub1,sub2))
  val s2=Student("def",20,List(sub3,sub1))

  val sList=List(s1,s2)

预期输出为

学生名单(s1,s2) 过滤科目如下所述

s1 contains Student("abc",20,List(sub1))s2 contains Student("def",20,List(sub1))sub2 and sub3 被过滤掉。

我在下面尝试过但没有用

 val filtered=sList.map(x=>x.subjects.filter(_.name=="maths"))

您所做的没有用,因为您将学生列表变成了学科列表。

我下面做的是保留每个学生,但修改他们的科目列表

sList.map(student => student.copy(subjects = student.subjects.filter(_.name=="maths")))

如果列表中有未注册相关主题的学生,那么我认为您不希望该学生出现在结果列表中。

val s3=Student("xyz",20,List(sub2,sub3))

val sList=List(s1,s2,s3)
sList.flatMap{s =>
  if (s.subjects.contains(sub1))         // if sub1 is in the subjects list
    Some(s.copy(subjects = List(sub1)))  // drop all others from the list
  else 
    None  // no sub1 in subjects list, skip this student
}