Как добавить преобразованный объект для установки с помощью итерации списка в Scala - PullRequest
0 голосов
/ 08 января 2019

Я новичок в Scala, я пытаюсь преобразовать и добавить объект, перебирая список в Scala, но плохо борюсь с синтаксисом и, возможно, концепцией.

Я хочу достичь чего-то подобного ниже, как мы делаем в JAVA.

public Set<Manager> promoteEmployeesToManager(List<Employee> employees) {
    Set<Manager> managers = new HashSet<Manager>();
    for(employee: employees){
        if(employee.getExprience() > 5) {
              managers.add(promoteEmployee(employee));
        }
    }
    return managers;
}

public Manager promoteEmployee(Employee employee){
    return new Manager(employee);
}

Я попробовал приведенный ниже код, но он не работает. На шаге saveNewManagers(newManagers.toArray); newManagers все еще пуст.

private def processEmployeePromotion(employees : List[Employee]) {
    val newManagers: Set[Manager] = Set()
    employees.asScala.map(employee => promoteEmployee(newManagers, employee))
    saveNewManagers(newManagers.toArray);
}

Тогда метод promoEmployee выглядит так:

private def promoteEmployee (newManagers : Set[Manager], employee: Employee){
    if(employee.getExprience() > 5) {
          managers+.(new Manager(employee));
    }
}

Ответы [ 4 ]

0 голосов
/ 08 января 2019
 val managers: Set[Manager] = employees
  .iterator
  .filter(_.getExperience > 5) 
  .map(promoteEmployee)
  .toSet
0 голосов
/ 08 января 2019

В Scala Set является неизменным по умолчанию, поэтому метод + для Set возвращает новый набор.

private def promoteEmployee(managers: Set[Manager], employee: Employee): Set[Manager] = 
  if (employee.getExperience > 5) {
    managers + new Manager(employee)
  } else {
     managers
  }

private def processEmployeePromotion(employees: List[Employee]): Unit = {
  val newManagers = employees.asScala.foldLeft(Set.empty[Manager]) { (managers, employee) =>
    promoteEmployee(managers, employee)
  }
  saveNewManagers(newManagers.toArray)
}

Основным изменением здесь является foldLeft, который в основном абстрагируется от идеи циклического создания и построения Set.

Альтернативной стратегией было бы promoteEmployee вернуть Option[Manager]; вы можете думать о Option как о наборе не более чем одного элемента.

private def promoteEmployee(employee: Employee): Option[Manager] =
  if (employee.getExperience > 5) {
    Option(new Manager(employee))
  } else {
     None
  }

private def promotedEmployees(employees: Iterable[Employee]): Set[Manager] =
  employees.flatMap(promoteEmployee).toSet  // NB: might not work if Manager doesn't obey the equality contract...

private def processEmployeePromotion(employees: List[Employee]): Unit = {
  saveNewManagers(promotedEmployees(employees.asScala).toArray)
}
0 голосов
/ 08 января 2019

Когда вы начинаете работать со Scala, вы должны привыкнуть работать с неизменяемыми структурами данных, складываемыми значениями, выражениями и т. Д. Вы можете по-прежнему работать с mutable, как вы привыкли делать с Java, если хотите, но первое, что вы должны сделать.

Посмотрите на этот пример, используя foldLeft из списка:

case class Employee(id: String, name: String, experience: Int)
case class Manager(employee: Employee)

object Your_Code extends App {
  def promoteEmployee(employee: Employee) =
    Manager(employee)

  def promoteEmployeesToManager(list: List[Employee]) : Set[Manager] = {
    list.foldLeft(Set[Manager]())((a, b) => if(b.experience > 5) a + promoteEmployee(b) else a)
  }

  val employess = List(Employee("id1", "name1", 6), Employee("id1", "name1", 4))
  println(promoteEmployeesToManager(employess))
}
0 голосов
/ 08 января 2019

Итак, у вас есть List сотрудников, и вы хотите List новых менеджеров.

def processEmployeePromotion(employees :List[Employee]) :List[Manager] =
  employees.collect{case emp if emp.getExprience() > 5 => promoteEmployee(emp)}

Будет возвращено пустое значение List, если список сотрудников пуст или если ни один из сотрудников не подходит для повышения.

...