使用流和lambda在Java8中使用if-else条件

使用流和lambda在Java8中使用if-else条件,java,lambda,java-8,functional-programming,java-stream,Java,Lambda,Java 8,Functional Programming,Java Stream,我读过这篇文章 Java8的全部目的是编写更加优雅、可读性和简洁的代码。 我使用Java8流和Lambda重写了这个execute方法,但最终得到的结果与Java7版本没有任何不同 private static boolean execute(String expression) { Deque<Character> stack = new ArrayDeque<>(); for (char c : expression.toCharArray()) {

我读过这篇文章

Java8的全部目的是编写更加优雅、可读性和简洁的代码。 我使用Java8流和Lambda重写了这个execute方法,但最终得到的结果与Java7版本没有任何不同

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();
}
private静态布尔执行(字符串表达式){
Deque stack=new ArrayDeque();
for(char c:expression.toCharArray()){
if(等温剂(c)){
堆栈推送(c);
}else if(stack.isEmpty()| |!匹配(stack.pop(),c)){
返回false;
}
}
返回stack.isEmpty();
}
这就是现在Java8中的方法

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();
}
private静态布尔执行(字符串表达式){
char[]a=expression.toCharArray();
Deque stack=new ArrayDeque();
IntStream.range(0,a.length).forEach(i->{
if(isOpenToken(a[i])){
栈推(a[i]);
}否则{
匹配(stack.pop(),a[i]);
}
});
返回stack.isEmpty();
}

在Java 8中有没有更优雅的方法来实现这一点?

这里可以做的不多,流非常适合映射、过滤、聚合和收集。。。在这里,每个元素只有副作用。您可能希望通过应用映射来使用流的一些功能优势:

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

这是一个常见的误解,即当您使用流时,一切都将“变得更加优雅”。这段代码现在非常好,您不应该替换代码中的每个for循环来使用streams。您可能对String中的方法感兴趣。您还应该注意,您的stream版本和最初的Java 7解决方案不会这样做。在第一个版本中,如果
,您将提前退出!匹配(stack.pop(),c)
。这已在流版本中消失。@dpr Yes两个版本产生相同的结果,但处理方式不同。不过我认为Java8会慢一些,因为它必须遍历列表中的所有项目。这是因为不能使用
forEach
使
中断
返回
。但是,最后,
stack.isEmpty()
可以是true,也可以是false。我已决定使用Java 7版本.Upvote来避免转换为流。使用
expression.chars()
在chars上获得
IntStream
,而无需先将所有内容复制到数组中,这会更有意义。