我无法在流中对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;
}
}
答案 0 :(得分:1)
尝试此广播。因为filter
仅根据您的检查规则过滤流。这是解决问题的一种方法。或使用map
进行投射。
MyClass argument = ((MyClass)arg.getAllValues()
.stream().
.filter(v -> v instanceof MyClass)
.findFirst()
.get());
PS:map
与您的结果是否多于一项都适用有关。在您的问题中,广播更合适
答案 1 :(得分:1)
问题中显示的for每个循环示例在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