如何用OpenRewrite为Java Stream API调用添加换行符?
使用OpenRewrite格式化Java流式调用代码
核心思路
OpenRewrite提供了代码格式化能力,既可以用内置规则实现标准风格的代码格式化,也能自定义规则精准处理链式调用的换行与缩进,满足将紧凑流式调用拆分为每行一个方法的需求。
具体实现
1. 方案一:使用内置格式化规则
OpenRewrite的org.openrewrite.java.Format内置规则遵循标准Java代码风格,会自动将链式调用的每个方法单独换行并添加缩进。只需在Rewrite配置文件(如rewrite.yml)中添加如下配置:
type: specs.openrewrite.org/v1beta/recipe name: com.yourorg.FormatStreamChain displayName: 格式化流式调用代码 recipeList: - org.openrewrite.java.Format
2. 方案二:自定义精准格式化规则
如果需要仅针对流式API链式调用做处理,避免影响其他代码格式,可以编写自定义规则:
package com.yourorg; import org.openrewrite.*; import org.openrewrite.java.tree.*; public class FormatStreamChain extends Recipe { @Override public String getDisplayName() { return "格式化流式链式调用"; } @Override public String getDescription() { return "将Java流式调用的每个方法单独换行并缩进"; } @Override public TreeVisitor<?, ExecutionContext> getVisitor() { return new JavaIsoVisitor<ExecutionContext>() { @Override public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) { J.MethodInvocation processedMethod = super.visitMethodInvocation(method, ctx); // 判断当前调用是否属于链式调用的后续节点 if (processedMethod.getSelect() instanceof J.MethodInvocation) { // 为当前方法调用添加换行和缩进 return processedMethod.withPrefix(Space.EMPTY.withWhitespace("\n ")); } return processedMethod; } }; } }
3. 效果验证
将规则应用到目标代码后,原本紧凑的写法:
List.of(1, 2, 3) .stream().map(integer -> integer * integer).filter(integer -> integer % 2 == 0).collect(Collectors.toSet());
会被格式化为:
List.of(1, 2, 3) .stream() .map(integer -> integer * integer) .filter(integer -> integer % 2 == 0) .collect(Collectors.toSet());
补充说明
- 内置
Format规则默认遵循IntelliJ IDEA的代码风格,若需调整缩进宽度等细节,可通过配置org.openrewrite.java.format.JavaFormatter修改参数。 - 自定义规则更适合针对性场景,不会干扰其他代码的原有格式。
内容的提问来源于stack exchange,提问作者Alexander Kazantsev
相关产品推荐
相关产品推荐

