Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java8流中强制转换具有不同类的对象? 用例_Java_Java 8_Java Stream - Fatal编程技术网

如何在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(连接(“,”)