Foreach и case в scala вместе. Что называется этой структурой?

Jwan622 спросил: 12 мая 2018 в 04:35 в: scala

У меня есть такой метод:

def close(): Unit = {
    things.foreach {
      case (attr1, attr2) =>
        File.<do_something>(attr1, attr2)
    }
  }

Какая структура это? Я знаю, что он выполняет итерацию через весь things, который является картой, если <attr1, attr2>. Могу ли я получить доступ к самой вещи? Что делать, если я также хотел совместить шаблон с классом / типом thing. Как я могу это сделать?

2 ответа

Есть решение
prayagupd ответил: 12 мая 2018 в 04:52

foreach - это метод, который принимает в качестве аргумента функцию f: A => U.

  @inline final override def foreach[U](f: A => U) {
    var these = this
    while (!these.isEmpty) {
      f(these.head)
      these = these.tail
    }
  }

Пример ниже

scala> List(1, 2, 3).foreach{elem => println(s"my elem is $elem")}
my elem is 1
my elem is 2
my elem is 3

Теперь, хорошая вещь о scala заключается в том, что вы можете сопоставлять образцы по элементам. ( читать о patmat в scala )

scala> List(1, "data", 3).foreach { 
         case elem: String => println(s"my elem is $elem") 
         case _ => println("something else")
       }
something else
my elem is data
something else

Второй пример - это то, что происходит в вашем примере. вы сравниваете каждый элемент с case (attr1, attr2)

example,

scala> Map(1 -> "order 1", 2 -> "order 2", 3 -> "order 3").foreach { 
            case (key, value) => println(value)
       }
order 1
order 2
order 3scala> List((1, "order 1"), (2, "order 2"), (3, "order 3")).foreach { 
            case (key, value) => println(value)
       }
order 1
order 2
order 3

Без соответствия шаблону вы также можете сделать,

erip ответил: 12 мая 2018 в 04:48

Это приложение анонимной функции, которая имеет два аргумента для каждого элемента в things.

В случае, если things является Map[A, B], он будет применять File.<do_something> к ключу и значению каждой пары на карте, если первый аргумент <do_something> имеет тип A, а второй аргумент имеет тип B.