使用Kotlin streams和filter会引发无法强制转换到自定义类型异常

使用Kotlin streams和filter会引发无法强制转换到自定义类型异常,kotlin,Kotlin,我正在探索C Linq的等价物,但在科特林,所以我遇到了溪流: val c = Manager.customers.entries.stream() .filter { x -> x.value.name == "Jaime Garcia" } //在此之后,c是引用管道类型。。。显然地还要考虑管理者。客户是HashMap类型的。 然后当我使用它时: val id=c作为客户?.id 。。。它抛出一个错误: java.lang.ClassC

我正在探索C Linq的等价物,但在科特林,所以我遇到了溪流:

val c = Manager.customers.entries.stream()
                        .filter { x -> x.value.name == "Jaime Garcia" }
//在此之后,c是引用管道类型。。。显然地还要考虑管理者。客户是HashMap类型的。 然后当我使用它时: val id=c作为客户?.id

。。。它抛出一个错误:

java.lang.ClassCastException:java.util.stream.ReferencePipeline$2 无法转换为com.example.mypackage.Customer


也许我应该在使用之前映射c,我尝试了在过滤器后面附加.collectCollectors.toMapa->a.getValue之类的东西,但从语法上看,它甚至不起作用

您不应该在Kotlin*中使用Java的流API。相反,您应该使用Kotlin标准库提供给您的内容来处理集合

如果您的客户地图如下所示:

val customers = mapOf(1 to Customer("Foo"), 2 to Customer("Bar"))
val c = customers.values.filter { x -> x.name == "Foo" }
您可以检索匹配客户的列表,如下所示:

val customers = mapOf(1 to Customer("Foo"), 2 to Customer("Bar"))
val c = customers.values.filter { x -> x.name == "Foo" }
请注意,c将是一个列表

如果要立即使用单个元素,请使用firstOrNull,例如:

val foo = customers.values.firstOrNull { x -> x.name == "Foo" }

val id = c?.id // id will be null or a Customer

至少只要你能避免它。我刚刚发现Kotlin标准库提供了,因此它并不气馁。

您不应该在Kotlin*中使用Java的流API。相反,您应该使用Kotlin标准库提供给您的内容来处理集合

如果您的客户地图如下所示:

val customers = mapOf(1 to Customer("Foo"), 2 to Customer("Bar"))
val c = customers.values.filter { x -> x.name == "Foo" }
您可以检索匹配客户的列表,如下所示:

val customers = mapOf(1 to Customer("Foo"), 2 to Customer("Bar"))
val c = customers.values.filter { x -> x.name == "Foo" }
请注意,c将是一个列表

如果要立即使用单个元素,请使用firstOrNull,例如:

val foo = customers.values.firstOrNull { x -> x.name == "Foo" }

val id = c?.id // id will be null or a Customer

至少只要你能避免它。我刚刚发现Kotlin标准库提供了,因此不建议使用它。

如果要使用正确的Kotlin语法,还可以使用:


如果要使用正确的Kotlin语法,还可以使用:


Stream.filter返回一个流:。不是顾客。不清楚你想要实现什么。如果希望第一个元素与谓词匹配,则使用.findFirst,它将返回可选的。阅读javadoc:它帮助很大。并要求IDE指定变量的类型。您不必强制转换任何内容。Stream.filter返回一个流:。不是顾客。不清楚你想要实现什么。如果希望第一个元素与谓词匹配,则使用.findFirst,它将返回可选的。阅读javadoc:它帮助很大。并要求IDE指定变量的类型。你不应该投任何东西。让我们在这里是多余的。Manager.customers.values.find{it.name==Jaime Garcia}?.id:let在这里是多余的。Manager.customers.values.find{it.name==Jaime Garcia}?.id: