【问题标题】:How configure intellij java formatter to format .stream() like other methods如何像其他方法一样配置 intellij java formatter 来格式化 .stream()
【发布时间】:2019-08-19 13:23:55
【问题描述】:

我正在尝试将 IntelliJ 格式化程序设置为对流使用与其他方法调用相同的新行格式。

如果我得到的代码行超过 100 个字符的限制,IntelliJ 会像这样格式化它:

StringBuilder stringBuilder = new StringBuilder();
stringBuilder
    .append("foo")
    .append("foo")
    .append("foo")
    .append("foo")
    .append("foo")
    .append("foo")
    .append("foo")
    .append("foo");

如果我的代码行包含的流也超过了 100 个字符的限制,intellij 在流语句后开始新行:

List<Integer> list = new ArrayList<>();
list.subList(0, 2).stream()
    .filter(foo -> foo.equals(foo))
    .filter(foo -> foo.equals(foo))
    .filter(foo -> foo.equals(foo));

如何告诉格式化程序像其他方法一样对流使用相同的格式?

List<Integer> list = new ArrayList<>();
list
    .subList(0, 2)
    .stream()
    .filter(foo -> foo.equals(foo))
    .filter(foo -> foo.equals(foo))
    .filter(foo -> foo.equals(foo));

仅当代码行超过 100 个字符的限制时才适用此格式,否则应保留在一行中。

编辑:我将我的 intellij 版本更新为 2019.2 并重新导入了我的 CodeStyle xml。 现在我无法再重现我的问题了。

【问题讨论】:

  • 您是否已经尝试过使用“Wrap first call”选项?您可以在 Settings -> Editor -> Code Style -> Java -> Wrapping and Braces -> Chained Method Calls 中找到它。
  • @ErikNellessen 是的,我已经尝试过了——结果还是一样:/

标签: java intellij-idea


【解决方案1】:

我无法重现 IntelliJ IDEA Ultimate 2019.2 的问题。我创建了以下类:

public class Foo {

    void bar() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("foo").append("foo").append("foo").append("foo").append("foo").append("foo").append("foo").append("foo");

        List<Integer> list = new ArrayList<>();
        list.subList(0, 2).stream().filter(foo -> foo.equals(foo)).filter(foo -> foo.equals(foo)).filter(foo -> foo.equals(foo));
    }

}

重新格式化(CTRL+ALT+L)后,代码如下所示:

public class Foo {

    void bar() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder
                .append("foo")
                .append("foo")
                .append("foo")
                .append("foo")
                .append("foo")
                .append("foo")
                .append("foo")
                .append("foo");

        List<Integer> list = new ArrayList<>();
        list
                .subList(0, 2)
                .stream()
                .filter(foo -> foo.equals(foo))
                .filter(foo -> foo.equals(foo))
                .filter(foo -> foo.equals(foo));
    }

}

这是我作为 XML 的代码样式设置:

<code_scheme name="Project" version="173">
  <codeStyleSettings language="JAVA">
    <option name="ALIGN_MULTILINE_CHAINED_METHODS" value="true" />
    <option name="ALIGN_MULTILINE_PARAMETERS_IN_CALLS" value="true" />
    <option name="METHOD_PARAMETERS_WRAP" value="2" />
    <option name="THROWS_LIST_WRAP" value="1" />
    <option name="METHOD_CALL_CHAIN_WRAP" value="2" />
    <option name="WRAP_FIRST_METHOD_IN_CALL_CHAIN" value="true" />
    <option name="BINARY_OPERATION_WRAP" value="1" />
    <option name="ARRAY_INITIALIZER_WRAP" value="1" />
  </codeStyleSettings>
</code_scheme>

【讨论】:

  • 如果您将“链式方法调用”设置为“如果长时包装”(而不是“始终包装”),您应该能够重现它。请记住再次复制粘贴我的示例,因为您已激活“重新格式化时保留”->“换行符”选项。我编辑了我的问题以强调多行格式应该只在代码行超过限制时出现。
  • 现在我已经更新到 Idea 2019.2(我之前使用的是 2018.1.8)并重新导入了我的代码样式文件(这是来自 google 的那个),我自己无法重现它。
  • 如果我将“Chained method calls”设置为“Wrap if long”(而不是“Wrap always”),IntelliJ IDEA 的代码格式会大不相同。它不会将每个链接的方法调用都放在一个新行中,而是将它们中的许多放在同一行中,直到达到 100 个字符的限制。
  • 我也一样。由于我无法复制原始问题,我应该关闭/删除这个问题吗? (对不起,这是我的第一个 stackoverflow 问题)
  • 我也不是 stackoverflow 方面的专家。我会说您应该编辑您的问题并添加一行,说明您无法再重现该问题。你应该添加一行来描述你是如何达到你希望的代码格式的。这样,您的问题仍然可以帮助其他有类似问题的人。
猜你喜欢
  • 2017-08-24
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多