java - 使用流和 lambda 在 Java 8 中使用 if-else 条件
问题描述
我已阅读这篇文章如何在 Java 8 流 forEach 中使用 if-else 逻辑
Java 8 的重点是编写更优雅、可读和简洁的代码。我使用 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 中有没有更优雅的方法来做到这一点?
解决方案
不多,可以在这里完成,流非常适合映射、过滤、聚合、收集......在这里你只对每个元素都有副作用。您可能想通过应用映射来使用流的一些功能优势:
IntStream.range(0, a.length).map(i -> a[i]).forEach(el -> {
if (isOpenToken(el)) {
stack.push(el);
} else {
matches(stack.pop(), el);
}
});
推荐阅读
- sharepoint - 有没有办法从 SharePoint Online 团队网站中删除搜索框?
- r - 对象转换为 xts 但应用 dailyReturn 时出现错误
- sql - 如何查询数据库以修改记录
- python-3.x - 通过子字符串值列表获取列
- powershell-4.0 - PowerShell中分隔线的重复字符
- javascript - 如何根据点击的另一个html页面中的图像刷新html页面中的图像副本?
- batch-file - 我的批处理文件代码有问题,找不到问题
- vue.js - vue.js“类型错误:无法读取未定义的属性‘路径’”
- oracle - 如何在子表ORACLE SQL中分配两个外键?
- r - 为什么 R 不应用具有反应值的 mutate ?