[英]Java stream type issue
我无法以某种方式在流中对instanceof
使用检查。 测试中出现问题:
ArgumentCaptor<MyClass> arg = ArgumentCaptor.forClass(MyClass.class);
verify(modelService).save(arg.capture());
方法save
使用不同的参数(不同类的实例)调用了3次,并且arg.getAllValues()
返回SomeOtherClassObject1,SomeOtherClassObject2,MyClassObject
流波纹管引发异常“ SomeOtherClass无法强制转换为MyClass”
MyClass argument = arg.getAllValues().stream()
.filter(v -> v instanceof MyClass)
.findFirst()
.get()
但是,如果我使用foreach,一切都会很好:
MyClass argument = null;
for(Object o : arg.getAllValues()) {
if(o instanceof MyClass) {
argument = (MyClass) o;
break;
}
}
尝试这种铸造 。 因为filter
仅根据您的检查规则过滤流。 这是解决问题的一种方法。 或使用map
进行投射。
MyClass argument = ((MyClass)arg.getAllValues()
.stream().
.filter(v -> v instanceof MyClass)
.findFirst()
.get());
PS:如果您的结果不止一个地适用于所有map
则map
更相关。 在您的问题中更适合投射
问题中显示的for each循环示例在instanceof检查之后包含一个显式强制转换。 以下内容等效于该循环:
MyClass argument =
arg.getAllValues()
.stream() // Stream<SomeOtherClass>
.filter(v -> v instanceof MyClass) // Stream<SomeOtherClass>
.map(MyClass.class::cast) // Stream<MyClass>
.findFirst() // Optional<MyClass>
.orElse(null); // MyClass
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.