Java流类型问题

时间:2018-09-01 20:06:50

标签: java java-stream

我无法在流中对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;
    }
}

2 个答案:

答案 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