使用Kotlin流和过滤器将无法转换为我的自定义类型异常

时间:2019-04-11 15:59:22

标签: kotlin

我正在探索等效于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()))之类的东西,但是从语法上讲它甚至不起作用

2 个答案:

答案 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