Как преобразовать преобразование коллекции с помощью java в scala


Приведенный ниже код преобразует список типов List<TestObj> в список типов List<List<String>> где каждый элемент списка в типе List<List<String>> является строковым списком размер 1. Это очень итеративный подход, можно ли его преобразовать в более функциональный метод в Scala ? Возможное решение : сопоставьте шаблон на List<String> и просто создайте новый список с помощью каждый элемент головы ?

Вывод ниже кода java:

strVal is 1 
New list 
strVal is 2 
New list


public class Driver {

        public static void main (String args[]){

        /**
         * Setup the test list data
         */
        List<String> l = new ArrayList<String>(); 
        l.add("1");
        l.add("2");     
        TestObj t = new TestObj();
        t.setTestList(l);
        t.setName("test");
        List<TestObj> tList = new ArrayList<TestObj>();
        tList.add(t);

        /**
         * Convert the list to a new data structure
         */
        List<List<String>> l3 = new ArrayList<List<String>>();
        List<String> l2 = new ArrayList<String>();      
        int counter = 0;
        for(TestObj tListElement : tList){ 
            if(tListElement.getName().equalsIgnoreCase("test")){
            List<String> lvo = tListElement.getTestList();      
            for(String lv : lvo){
                l2.add(lv);
                ++counter;
                if(counter == 1){
                    counter = 1;
                    l3.add(l2);
                    l2 = new ArrayList<String>();
                    counter = 0;
                }
            }
        }
        }

        /**
         * Output the values of the new data structure
         */
        for(List<String> listVals : l3){
            for(String strVal : listVals){
                System.out.println("strVal is "+strVal);
            }
            System.out.println("New list");
        }
    }
}

import java.util.List;


public class TestObj {

    private String name;
    private List<String> testList;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<String> getTestList() {
        return testList;
    }
    public void setTestList(List<String> testList) {
        this.testList = testList;
    }

}
1 4

1 ответ:

case class TestObj(name: String, testList: Seq[String])

object Driver extends App {

  // Setup the test list data
  val tList = Seq(TestObj("test", Seq("1", "2")))

  // Convert the list to a new data structure
  val l3 = for {
      t <- tList
      if t.name equalsIgnoreCase "test"
      lv <- t.testList
    } yield Seq(lv)

  // Output the values of the new data structure
  for (listVals <- l3) {
    for (strVal <- listVals) {
      println("strval is " + strVal)
    }
    println("New list")
  }

}