Это то, что я придумал:
scala> val l1 = List((List("AAA"),"B1","C1"),(List("BBB"),"B2","C2"))
l1: List[(List[String], String, String)] = List((List(AAA),B1,C1), (List(BBB),B2,C2))
scala> val l2 = List((List("AAA"), List("a", "b", "c")), (List("BBB"), List("c", "d", "e")))
l2: List[(String, List[String])] = List((AAA,List(a, b, c)), (BBB,List(c, d, e)))
scala> l1.collectFirst {
| case tp => l2.find(tp2 => tp2._1.head == tp._1.head).map(founded => (tp._1, tp._2, tp._3, founded._2))
| }.flatten
res2: Option[(List[String], String, String, List[String])] = Some((List(AAA),B1,C1,List(a, b, c)))
Вы можете использовать collectFirst
для фильтрации значений вы не хотите, и на каждом наборе вы используете find
на втором списке и отобразить его в кортеж вы хотите ,
Несколько примечаний, это ужасно, я не знаю, как вы получили с Tuple4
в первую очередь, лично я ненавижу все, что tp._*
нотацию, это трудно читать, думать об использовании классов случая, чтобы обернуть все что в какую-то более управляемую структуру, во-вторых, мне пришлось использовать .head
, который в случае пустого списка выдаст исключение, поэтому вы можете сделать некоторые проверки до этого, но, как я уже сказал, я бы полностью просмотрел свой код и не тратил время на работу на некоторых недостатках архитектуры в первую очередь.
песни2 не является действительным списком; возможно, вы можете это исправить, и мы можем идти оттуда? В частности, эти квадратные скобки не имеют смысла в этом контексте. – jamesmulcahy
Можете ли вы увидеть мое редактирование сейчас. – Yogesh
Не могли бы вы привести больше примеров или перефразировать то, что вы хотите? «Первый элемент из списка2 с первым элементом списка1 и получить объединенный список» будет List ((List («AAA»), «B1», «C1»), («AAA», List («a», «b», , "c"))), а не список, который вы дали. – red1ynx