Проблема с типом потока Java - PullRequest
       9

Проблема с типом потока Java

0 голосов
/ 01 сентября 2018

Почему-то я не могу использовать проверку instanceof в потоке. Проблема возникла в тесте:

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

Метод save вызывается три раза с разными аргументами (экземплярами разных классов), а 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 голосов
/ 01 сентября 2018

Пример для каждого цикла, показанный в вопросе, содержит явное приведение после проверки 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
0 голосов
/ 01 сентября 2018

Попробуйте с этим кастингом . Потому что filter только фильтрует поток согласно вашему правилу проверки. Это одно решение для решения проблемы. Или используйте map для сотворения.

MyClass argument = ((MyClass)arg.getAllValues()
    .stream().
    .filter(v -> v instanceof MyClass)
    .findFirst()
    .get());

PS: map более уместно, если к вашим результатам более одного претендовать на всех. В вашей задаче кастинг больше подходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...