map直接映射到Array

时间:2017-09-06 13:50:01

标签: arrays scala vector mapping temporary

以下代码创建临时Vector:

@Test
    public void fileUpload_Success() {

        String fullPath = "C:\\test\\myFile.txt";

        //Your call here to upload the file.
        org.w3c.dom.Document myFile = buildTestFile();
        ExportFileToDisk exportComponent = new ExportFileToDisk();
        exportComponent.exportXMLFile(myFile, fullPath);

        File f = new File(fullPath);
        boolean fileExists = (f.exists() && !f.isDirectory());

        assertTrue(fileExists);
    }

以下代码创建一个临时数组:

0.to(15).map(f).toArray
^^^^^^^^
Sequence
^^^^^^^^^^^^^^^
    temp Vector
^^^^^^^^^^^^^^^^^^^^^^^
                  Array

有没有办法在序列上映射f并直接获取数组,而不会产生临时的?

3 个答案:

答案 0 :(得分:5)

您可以使用breakOut

val res: Array[Int] = 0.to(15).map(f)(scala.collection.breakOut)

0.to(15).map[Int, Array[Int]](f)(scala.collection.breakOut)

或使用view

0.to(15).view.map(f).to[Array]

有关观看次数的详情,请参阅this document

答案 1 :(得分:1)

(0 to 15).iterator.map(f).toArray

答案 2 :(得分:1)

如果您要掌握如何构建初始Range的方法,则可以使用Array Array.range(start, end)中的companion object来直接创建Range作为Array而没有强制转换:

Array.range(0, 15) // Array[Int] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14)

可以这样从Array映射到Array

Array.range(0, 15).map(f) // Array[Int] = Array(0, 2, 4, 6, 8, 10, 12, 14, ...)

注意Array.range(i, j)等同于i until ji to j+1)而不是i to j


使用Array.tabulate,甚至更短,一次通过,但可读性较低:

Array.tabulate(15)(f) // Array[Int] = Array(0, 2, 4, 6, 8, 10, 12, 14, ...)