如何将Java集合转换为Java中的Kotlin序列(反之亦然)?

时间:2018-08-09 07:25:37

标签: java collections kotlin sequence

我正在用Java实现Kotlin接口,希望我返回一个$ xmllint -format so-output.xml

如何将Java集合转换为Kotlin <?xml version="1.0"?> <EnterpriseDocument> <FuelTankList> <Tank fuelItem="Diesel" Sales="5000"/> <Tank fuelItem="Petrol" Sales="1000"/> </FuelTankList> </EnterpriseDocument> ?相反,如何将Kotlin Sequence<T>转换为Java集合?

3 个答案:

答案 0 :(得分:1)

由于Kotlin代码是从Java运行的,因此变得有些棘手。

让我们尝试重新创建场景:

科特琳:

interface SequenceInterface {
    fun foo(list: List<Int>) : Sequence<Int>
}

如果检查Kotlin代码,则会发现Sequence接口没有特定的实现。因此,在您的情况下,您需要自己实现(就像Kotlin在调用asSequence时所做的一样:

public class Foo implements SequenceInterface {
    @NotNull
    public Sequence<Integer> foo(final List<Integer> list) {
        return () -> list.listIterator();
    }
}

然后可以开始在Java中使用它:

new Foo().foo(Arrays.asList(42))

请记住,由于所有有用的方法都是作为Kotlin扩展实现的,因此它们都会消失。

是否要转换为List?在纯Java中,只需重申一下:

ArrayList<Integer> list = new ArrayList<>();
seq.iterator().forEachRemaining(list::add);

此外,请确保您绝对需要用Kotlin的代码返回Sequence。如果要实现更好的互操作性,则返回Stream会更有意义。

答案 1 :(得分:0)

以下是一些转换:

val javaList = java.util.ArrayList<String>()
javaList.addAll(listOf("A", "B", "C"))

// From Java List to Sequence
val seq = sequenceOf(*javaList.toTypedArray())
// or
val seq2 = javaList.asSequence()

// Sequence to Kotlin List
val list = seq.toList()

// Kotlin List to Sequence
val seqFromList = sequenceOf(*list.toTypedArray())
// or
val seqFromList2 = list.asSequence()

// Sequence to Java List
val newJavaList = java.util.ArrayList<String>().apply { seqFromList.toCollection(this) }
// or
val newJavaList2 = java.util.ArrayList<String>()
newJavaList2.addAll(seqFromList)

答案 2 :(得分:0)

赞:

val javaList = java.util.ArrayList<String>()
val kotlinSeq = javaList.asSequence()
val newJavaList = java.util.ArrayList<String>().apply { kotlinSeq.toCollection(this) }