我正在探索等效于C#Linq的方法,但是在Kotlin中,所以我遇到了很多问题:
val c = Manager.customers.entries.stream()
.filter { x -> x.value.name == "Jaime Garcia" }
//在此c之后是ReferencePipeline类型...显然。还请考虑Manager.customers是HashMap()类型。
然后当我使用它时:
val id = (c as Customer)?.id
...它引发错误:
java.lang.ClassCastException:java.util.stream.ReferencePipeline $ 2 无法转换为com.example.mypackage.Customer
也许我应该在使用c之前映射c,我尝试在过滤器后附加.collect(Collectors.toMap(a -> a.getValue()))
之类的东西,但是从语法上讲它甚至不起作用
答案 0 :(得分:4)
您不应在Kotlin *中使用Java的流API。相反,您应该使用Kotlin标准库提供的内容来处理集合。
如果您的客户地图如下:
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标准库提供了utility functions to work with Java 8 streams,因此它暗示着我们不鼓励这样做。
答案 1 :(得分:2)
如果您想使用正确的Kotlin语法,也可以使用find:
Manager.customers.values
.find { it.name == "Jaime Garcia" }
?.id