使用Kotlin streams和filter会引发无法强制转换到自定义类型异常
我正在探索C Linq的等价物,但在科特林,所以我遇到了溪流:使用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
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: