2016-06-03 1 views
2

Я путаюсь с обозначениями «каждый» и «_» в scala. Я читал примерСмят с обозначениями в scala

val school = list.map(each=>((each.school,each.payment),each.amount)) 
      .reduceByKey(_+_) 
      .map(each=>(each._1,each._2)) 

для каждого элемента в списке, он принимает школу, оплаты, сумму и делает карту уменьшить такие вещи, сохраняя школу и оплаты в качестве ключа.

ли эта линия

.map (каждый => (each._1, each._2))

трактует, что когда-то reducebykey операция выполняется, то отображение обратно в школу и сумма только в школу.

PLease уточнить мое понимание.

ответ

4

Во-первых, each это просто имя переменной - вы можете назвать его, как вам нравится:

.map(myTuple => (myTuple._1, myTuple._2)) 

Что еще более важно - что в прошлом отображение на самом деле ничего не делает. Зачем? Поскольку каждый reduceByKey результат имеет тип (K, V) для некоторых типов K и V - коллекция кортежей, а при вызове (each._1, each._2) для 2-кортежа по имени each, вы просто создать новый идентичный кортеж.

UPDATE: Если вы заинтересованы в (school, totalAmount) результате, вы должны принять только первую часть ключа (который сам кортеж!):

.map(each => (each._1._1, each._2)) 

Или лучше вариант с использованием сопоставление с образцом:

.map { case ((school, _), amount) => (school, amount) } 

Обратите внимание, что этот результат может содержать несколько записей с одинаковым значением school, поскольку ключ также содержал payment р Изобразительное искусство. Если школа появилась дважды с разными значениями оплаты на входе - этот последний результат не будет иметь уникальных значений school.

+0

Хорошее описание (y) –

Смежные вопросы