如何在Java8流中强制转换具有不同类的对象? 用例
我使用的是第三方库,其中有两个非常相似的类没有实现接口。代码当前在项目列表中循环,以使用这些类中的一个查找对象的第一个匹配项,然后将其转换为处理该对象的流。如果我可以将此代码转换为使用流并将其链接到我的其余代码中,那就太好了 现行代码 所需代码 问题:如何在Java8流中强制转换具有不同类的对象? 用例,java,java-8,java-stream,Java,Java 8,Java Stream,我使用的是第三方库,其中有两个非常相似的类没有实现接口。代码当前在项目列表中循环,以使用这些类中的一个查找对象的第一个匹配项,然后将其转换为处理该对象的流。如果我可以将此代码转换为使用流并将其链接到我的其余代码中,那就太好了 现行代码 所需代码 问题: 是否可以基于流中的上一个过滤器强制转换条目?不是最漂亮的代码,但您可以执行以下操作: components.stream() .filter(entry -> entry instanceof OptionalCompo
是否可以基于流中的上一个过滤器强制转换条目?不是最漂亮的代码,但您可以执行以下操作:
components.stream()
.filter(entry -> entry instanceof OptionalComponent3Bean
|| entry instanceof RequiredComponent3Bean)
.map(entry -> {
if ((entry instanceof OptionalComponent3Bean)
return ((OptionalComponent3Bean) entry).getSection().getEntry().stream();
else
return ((RequiredComponent3Bean) entry).getSection().getEntry().stream();
})
.findFirst();
这将返回一个可选
请注意,
findFirst
必须是最后一个操作,因为它是终端。不是最漂亮的代码,但您可以执行以下操作:
components.stream()
.filter(entry -> entry instanceof OptionalComponent3Bean
|| entry instanceof RequiredComponent3Bean)
.map(entry -> {
if ((entry instanceof OptionalComponent3Bean)
return ((OptionalComponent3Bean) entry).getSection().getEntry().stream();
else
return ((RequiredComponent3Bean) entry).getSection().getEntry().stream();
})
.findFirst();
这将返回一个可选
请注意,
findFirst
必须是最后一个操作,因为它是终端。不,没有任何东西可以使您免于糟糕的设计,这似乎是您所要对抗的
如果需要在许多地方复制类似于此的样板文件,可以通过包装器强制实现公共接口。
否则,我想你能做的就是
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
不,没有什么能让你免于糟糕的设计,这似乎是你正在与之抗争的 如果需要在许多地方复制类似于此的样板文件,可以通过包装器强制实现公共接口。 否则,我想你能做的就是
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
Component3Choice
是否定义了一个方法getSection()
?您是否可以修改OptionalComponent3Bean
和RequiredComponent3Bean
来实现一个接口(例如HasSection
),该接口将定义getSection()
,我无法访问该库的源代码:(是否Component3Choice
定义了一个方法getSection()
?您是否可以修改OptionalComponent3Bean
和RequiredComponent3Bean
来实现一个接口(例如HasSection
),该接口将定义getSection()
?不幸的是,我没有访问该库的源代码的权限。:(看起来很好,因为这样可以隔离逻辑。如果库得到更新并希望得到修复,那么转换将更容易。在另一种情况下,我正在呼叫。希望将集合的成员流式传输到.joining()但这会查找字符串、而不是long等CharSequence实例。我就是这样做的:setOfLongObjects.stream().map(it->“”+it).collect(collector.joining(“,”))看起来这很好,因为它隔离了逻辑。如果库得到更新并有望得到修复,那么转换会更容易。在另一种情况下,会发出警报。希望将集合的成员流式传输到.joining(),但这会查找字符串、而不是Longs等CharSequence实例。这就是我所做的:setOfLongObjects.stream().map(it->“”+it)。collect(连接(“,”)