Использование условия if-else в Java 8 с использованием потоков и лямбды - PullRequest
1 голос
/ 09 марта 2019

Я прочитал этот пост Как использовать логику if-else в потоке Java 8 forEach

Весь смысл Java 8 состоит в написании более элегантного, удобочитаемого и лаконичного кода.Я переписал этот метод execute с использованием Java 8 Streams и Lambda, но то, что я в итоге получаю, ничем не отличается от версии Java 7.

private static boolean execute(String expression) {
    Deque<Character> stack = new ArrayDeque<>();
    for (char c : expression.toCharArray()) {
        if (isOpenToken(c)) {
            stack.push(c);
        } else if (stack.isEmpty() || !matches(stack.pop(), c)) {
            return false;
        }
    }
    return stack.isEmpty();
}

Это то, как метод выглядит сейчас в Java 8

private static boolean execute(String expression) {
    char[] a = expression.toCharArray();
    Deque<Character> stack = new ArrayDeque<>();
    IntStream.range(0, a.length).forEach(i -> {
        if (isOpenToken(a[i])) {
            stack.push(a[i]);
        } else {
            matches(stack.pop(), a[i]);
        }
    });
    return stack.isEmpty();
}

Есть ли более элегантный способ сделать это в Java 8?

1 Ответ

1 голос
/ 09 марта 2019

Не много, что можно сделать здесь, потоки отлично подходят для отображения, фильтрации, агрегирования, сбора ... Здесь у вас есть только побочные эффекты для каждого элемента. Возможно, вы захотите использовать некоторые функциональные возможности потоков, применив отображение:

IntStream.range(0, a.length).map(i -> a[i]).forEach(el -> {
    if (isOpenToken(el)) {
        stack.push(el);
    } else {
        matches(stack.pop(), el);
    }
});
...