Java 如何使用Kotlin将列表转换为地图

Java 如何使用Kotlin将列表转换为地图,java,lambda,kotlin,Java,Lambda,Kotlin,我正试图从列表中构造一个地图。我的目标是比较两个列表并找出这两个列表之间的差异。然后,我想构建一个地图,以便知道我在哪个索引中发现了差异 我用Java做的,我相信不是用一种很好的方式,但它正在工作 //I compare the two values for a given index, if value are the same, I set null in my result list List<String> result = IntStream.range(0, list1.

我正试图从列表中构造一个地图。我的目标是比较两个列表并找出这两个列表之间的差异。然后,我想构建一个地图,以便知道我在哪个索引中发现了差异

我用Java做的,我相信不是用一种很好的方式,但它正在工作

//I compare the two values for a given index, if value are the same, I set null in my result list
List<String> result = IntStream.range(0, list1.size()).boxed()
                .map(i -> list1.get(i) != list2.get(i) ? (list1.get(i)  + " != "+ list2.get(i)) : null)
                .collect(Collectors.toList());

//I filter all the null values, in order to retrieve only the differences with their index
Map<Integer, String> mapResult =
            IntStream.range(0, result.size())
            .boxed().filter(i-> null != result.get(i))
            .collect(Collectors.toMap(i -> i,result::get));
//我比较给定索引的两个值,如果值相同,则在结果列表中设置null
列表结果=IntStream.range(0,list1.size()).boxed()
.map(i->list1.get(i)!=list2.get(i)?(list1.get(i)+“!=”+list2.get(i)):null)
.collect(Collectors.toList());
//我过滤所有空值,以便只检索与它们的索引之间的差异
映射结果=
IntStream.range(0,result.size())
.boxed().filter(i->null!=result.get(i))
.collect(Collectors.toMap(i->i,result::get));
这不是最优的,但它正在发挥作用。如果你对这些代码行有什么建议,我很乐意接受

我尝试在Kotlin中复制这种行为,但没有成功使用map()构造函数。(我还在学习Kotlin,我对它不是很熟悉)


谢谢您的帮助。

您可以在集合中使用
zip
函数来连接两个元素。
withIndex()
函数有助于将列表转换为元素索引和值对的列表。完整的解决方案如下所示


    val list1 = listOf("a", "b", "c")
    val list2 = listOf("a", "B", "c")

    val diff : Map<Int, String> = list1.withIndex()
        .zip(list2) { (idx,a), b -> if (a != b) idx to "$a != $b" else null}
        .filterNotNull().toMap()

并在使用
zip
函数之前调用两个列表中的函数

谢谢,这正是我所需要的!

fun <T> List<T>.addNulls(element: T, toSize: Int) : List<T> {
    val elementsToAdd = (toSize - size)
    return if (elementsToAdd > 0) {
        this + List(elementsToAdd) { element }
    } else {
        this
    }
}