Re: Pattern-matching in Java
От: C0s Россия  
Дата: 26.04.19 12:43
Оценка:
Здравствуйте, AJ, Вы писали:

AJ>Коллеги, есть ли какой-то способ упростить следующий код?


пример учебный? (это я к тому, чтобы не писать дурацких вопросов "зачем и кто это сделал так?")

    
AJ>    public static int process(Stream<Object> input) {
        
AJ>        Predicate<Object> isPair = Pair.class::isInstance;
AJ>        Predicate<Pair> isLeftInteger = pair -> pair.left instanceof Integer;
AJ>        Predicate<Pair> isRightInteger = pair -> pair.right instanceof Integer;
        
AJ>        return input
AJ>            .filter(e -> isPair.test(e) && isLeftInteger.test(((Pair) e)) && isRightInteger.test((Pair) e))

AJ>            // и вот здесь есть какой-нибудь избежать всей этой цепочки кастов по второму разу?
AJ>            .map(e -> ((Integer) ((Pair) e).left + ((Integer) ((Pair) e).right)))

AJ>            .mapToInt(Integer::intValue)
AJ>            .sum();

// как-то так, наверное
return input.filter(Pair.class::isInstance).map(Pair.class::cast).filter(isLeftInteger).filter(isRightInteger)
            .mapToInt(p -> ((Integer) p.left) + ((Integer) p.right)).sum();

AJ>    }


потенциально, если облегчить условие суммирования до "всех найденных Integer'ов даже в несимметричных по типу парах", то можно было бы сразу после map(cast) сделать разворот в
flatMap(p -> Stream.concat(p.left, p.right)).filter(Integer.class::isInstance).map(Integer.class::cast).mapToInt(Integer::intValue)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.