gpt4 book ai didi

java - 如何在 Java 8 流中转换具有不同类的对象?

转载 作者:行者123 更新时间:2023-12-01 18:16:55 24 4
gpt4 key购买 nike

用例

我正在使用一个第三方库,其中有两个非常相似的类,但没有实现接口(interface)。该代码当前循环遍历项目列表,以使用这些类之一查找对象的第一次出现,然后将其转换为进行处理的流。如果我可以将此代码转换为使用流并将其链接到我的代码的其余部分,那就太好了。

当前代码

    for (Component3Choice component: components) {
if (component instanceof OptionalComponent3Bean) {
OptionalComponent3Bean section = (OptionalComponent3Bean) component;

entryStream = section.getSection().getEntry().stream()
break;
}
else if (component instanceof RequiredComponent3Bean) {
RequiredComponent3Bean section = (RequiredComponent3Bean) component;

entryStream = section.getSection().getEntry().stream();
break;
}
}
... do something with the stream ...

所需代码

components.stream()
.filter(entry -> entry instanceof OptionalComponent3Bean
|| entry instanceof RequiredComponent3Bean)
.findFirst()
.map( {{ cast entry }} )
.map( castedEntry.getSection().getEntry())
... continue on with my processing

问题

是否可以根据流中先前的过滤器来转换条目?

最佳答案

不,没有什么可以让你避免糟糕的设计,而这似乎正是你所反对的。

如果您需要在许多地方复制与此类似的样板文件,您可以通过包装器强制使用通用接口(interface)。否则,我想你能做的最好的就是

static private IDontKnow getStream(Component3Choice c3c) {
if (c3c instanceof OptionalComponent3Bean) {
return ((OptionalComponent3Bean)c3c).getStream();
} else if (c3c instanceof RequiredComponent3Bean) {
return ((RequiredComponent3Bean)c3c).getStream();
} else {
return null;
}
}

components.stream()
.map(x -> getStream(x))
.filter(x -> x!=null)
.findFirst()
.map(x -> x.getEntry().stream());
... continue on with yout processing

关于java - 如何在 Java 8 流中转换具有不同类的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com