首页 > 解决方案 > Java流类型问题

问题描述

不知何故,我无法instanceof在流中使用检查。测试中出现问题:

ArgumentCaptor<MyClass> arg = ArgumentCaptor.forClass(MyClass.class);
verify(modelService).save(arg.capture());

方法save用不同的参数(不同类的实例)调用了 3 次,并arg.getAllValues()返回SomeOtherClassObject1,SomeOtherClassObject2,MyClassObject

Stream bellow 抛出异常“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;
    }
}

标签: javajava-stream

解决方案


The for each loop example shown in the question contains an explicit cast after the instanceof check. The following would be equivalent to that loop:

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

推荐阅读