我想通过lambda缩进实现以下内容:
多行语句:
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl)
.filter(
(x) ->
{
return x.contains("(M)");
}
).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
单行语句:
List<String> strings = Arrays.stream(ppl)
.map((x) -> x.toUpperCase())
.filter((x) -> x.contains("(M)"))
.collect(Collectors.toList());
当前,Eclipse将自动格式化为以下格式:
多行语句:
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl).filter((x) ->
{
return x.contains("(M)");
}).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
单行语句:
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des(M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl).map((x) -> x.toUpperCase())
.filter((x) -> x.contains("(M)")).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
而且我发现这真的很混乱,因为该collect
调用直接位于的下面,return
而且它们之间根本没有空间。如果我可以在缩进的新行中开始lambda,并且希望该.filter(
调用位于该.collect(
调用的正上方,则更希望这样做。但是,唯一可以使用标准Java-8
Eclipse Formatter定制的东西是lambda主体开始处的花()
括号,但事先没有括号,也没有缩进。
在单线呼叫的情况下,它仅使用基本的换行符,并使它成为一连串的混乱局面。我认为不需要解释为什么以后很难解密。
有什么办法可以以某种方式进一步自定义格式并在Eclipse中实现第一种格式类型?(或者,可选地,在另一个IntelliJ IDEA之类的IDE中。)
编辑:我能得到的最接近的是IntelliJ IDEA 13社区版(阅读:免费版:P),它是以下内容(由连续缩进定义,在这种情况下为8):
html" target="_blank">public static void main(String[] args)
{
int[] x = new int[] {1, 2, 3, 4, 5, 6, 7};
int sum = Arrays.stream(x)
.map((n) -> n * 5)
.filter((n) -> {
System.out.println("Filtering: " + n);
return n % 3 != 0;
})
.reduce(0, Integer::sum);
List<Integer> list = Arrays.stream(x)
.filter((n) -> n % 2 == 0)
.map((n) -> n * 4)
.boxed()
.collect(Collectors.toList());
list.forEach(System.out::println);
System.out.println(sum);
它还允许“对齐”链式方法调用,如下所示:
int sum = Arrays.stream(x)
.map((n) -> n * 5)
.filter((n) -> {
System.out.println("Filtering: " + n);
return n % 3 != 0;
})
.reduce(0, Integer::sum);
List<Integer> list = Arrays.stream(x)
.filter((n) -> n % 2 == 0)
.map((n) -> n * 4)
.boxed()
.collect(Collectors.toList());
list.forEach(System.out::println);
System.out.println(sum);
}
我个人发现,虽然它更有意义,但第二个版本将其推得太远,因此我更喜欢第一个。
负责第一次设置的设置如下:
<?xml version="1.0" encoding="UTF-8"?>
<code_scheme name="Zhuinden">
<option name="JD_ALIGN_PARAM_COMMENTS" value="false" />
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
<option name="JD_ADD_BLANK_AFTER_PARM_COMMENTS" value="true" />
<option name="JD_ADD_BLANK_AFTER_RETURN" value="true" />
<option name="JD_P_AT_EMPTY_LINES" value="false" />
<option name="JD_PARAM_DESCRIPTION_ON_NEW_LINE" value="true" />
<option name="WRAP_COMMENTS" value="true" />
<codeStyleSettings language="JAVA">
<option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
<option name="BRACE_STYLE" value="2" />
<option name="CLASS_BRACE_STYLE" value="2" />
<option name="METHOD_BRACE_STYLE" value="2" />
<option name="ELSE_ON_NEW_LINE" value="true" />
<option name="WHILE_ON_NEW_LINE" value="true" />
<option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
<option name="SPACE_WITHIN_BRACES" value="true" />
<option name="SPACE_BEFORE_IF_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_WHILE_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_FOR_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_TRY_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_CATCH_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_SWITCH_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_SYNCHRONIZED_PARENTHESES" value="false" />
<option name="SPACE_BEFORE_ARRAY_INITIALIZER_LBRACE" value="true" />
<option name="METHOD_PARAMETERS_WRAP" value="1" />
<option name="EXTENDS_LIST_WRAP" value="1" />
<option name="THROWS_LIST_WRAP" value="1" />
<option name="EXTENDS_KEYWORD_WRAP" value="1" />
<option name="THROWS_KEYWORD_WRAP" value="1" />
<option name="METHOD_CALL_CHAIN_WRAP" value="2" />
<option name="BINARY_OPERATION_WRAP" value="1" />
<option name="BINARY_OPERATION_SIGN_ON_NEXT_LINE" value="true" />
<option name="ASSIGNMENT_WRAP" value="1" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
<option name="PARAMETER_ANNOTATION_WRAP" value="1" />
<option name="VARIABLE_ANNOTATION_WRAP" value="1" />
<option name="ENUM_CONSTANTS_WRAP" value="2" />
</codeStyleSettings>
</code_scheme>
我试图确保一切都合理,但是我可能把事情弄糟了,因此可能需要稍作调整。
如果您像我一样是匈牙利人,并且使用的是匈牙利语布局,则此按键映射可能对您有用,因此您最终将无法使用AltGR + F,AltGR + G,AltGR + B
,AltGR + N和AltGR + M(分别对应于Ctrl + Alt)。
<?xml version="1.0" encoding="UTF-8"?>
<keymap version="1" name="Default copy" parent="$default">
<action id="ExtractMethod">
<keyboard-shortcut first-keystroke="shift control M" />
</action>
<action id="GotoImplementation">
<mouse-shortcut keystroke="control alt button1" />
</action>
<action id="GotoLine">
<keyboard-shortcut first-keystroke="shift control G" />
</action>
<action id="Inline">
<keyboard-shortcut first-keystroke="shift control O" />
</action>
<action id="IntroduceField">
<keyboard-shortcut first-keystroke="shift control D" />
</action>
<action id="Mvc.RunTarget">
<keyboard-shortcut first-keystroke="shift control P" />
</action>
<action id="StructuralSearchPlugin.StructuralReplaceAction" />
<action id="Synchronize">
<keyboard-shortcut first-keystroke="shift control Y" />
</action>
</keymap>
尽管IntelliJ似乎没有提供一种将lambda的左大括号放在新行中的方法,否则它是一种相当合理的格式化方式,因此我将其标记为已接受。
开箱即用的IntelliJ 13可能会为您工作。
如果我这样写:
// Mulit-Line Statement
String[] ppl = new String[] { "Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)" };
List<String> strings = Arrays.stream(ppl)
.filter(
(x) ->
{
return x.contains("(M)");
}
).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
然后应用自动格式化程序(无更改):
// Mulit-Line Statement
String[] ppl = new String[]{"Karen (F)", "Kevin (M)", "Lee (M)", "Joan (F)", "Des (M)", "Rick (M)"};
List<String> strings = Arrays.stream(ppl)
.filter(
(x) ->
{
return x.contains("(M)");
}
).collect(Collectors.toList());
strings.stream().forEach(System.out::println);
单行语句也是如此。我的经验是,IntelliJ在应用其自动格式化方面更加灵活。IntelliJ不太可能删除或添加换行符,如果将其放到那里,则假定您打算将其放到那里。IntelliJ会很高兴为您调整选项卡空间。
IntelliJ也可以配置为您执行某些操作。在“设置”->“代码样式”->“
java”下,在“包装和花括号”选项卡中,可以将“链方法调用”设置为“总是包装”。
自动格式化之前
// Mulit-Line Statement
List<String> strings = Arrays.stream(ppl).filter((x) -> { return x.contains("(M)"); }).collect(Collectors.toList());
// Single-Line Statement
List<String> strings = Arrays.stream(ppl).map((x) -> x.toUpperCase()).filter((x) -> x.contains("(M)")).collect(Collectors.toList());
自动格式化后
// Mulit-Line Statement
List<String> strings = Arrays.stream(ppl)
.filter((x) -> {
return x.contains("(M)");
})
.collect(Collectors.toList());
// Single-Line Statement
List<String> strings = Arrays.stream(ppl)
.map((x) -> x.toUpperCase())
.filter((x) -> x.contains("(M)"))
.collect(Collectors.toList());
问题内容: 如何将以下Objective-C代码转换为Swift代码? 我正在格式化。 问题答案:
问题内容: 我有一个包含瑞典语/挪威语字符串的数据库表。 查询某些数据时,将得到如下输出: 输出与 现在,如果我为了查看具有正确编码的字符,则MySQL命令行的表格输出格式将中断。 输出与 题: 这不是一个大问题,但会使输出更难阅读。有人知道如何保持表格格式完整吗? 问题答案: 简短答案 使用以下选项启动客户端: 您可以在文件中将此设置为默认值。 简短的答案不起作用,请看下面的波纹管 上述部队的命
我正面临着POI条件格式的一些问题。我不完全明白POI在这里做什么。我正在为值超过70的单元格值设置背景颜色格式规则。我想在我的应用程序中获得Cell样式(通过条件格式规则应用),但POI不会返回更新的单元格样式,而是返回默认样式。这是我的代码 使用上面的代码, 总是返回 0(即默认格式)。我觉得它应该向我返回带有背景颜色的更新格式样式。当我在实际的xlsx文件中编写上述工作簿并使用MSExcel
问题内容: 我有这个简单的代码: 然后我将得到以下异常: 如何解决这个问题? 问题答案: 是没有时区的日期时间。您以格式指定了时区偏移格式符号,但是没有此类信息。这就是为什么发生错误。 如果您需要时区信息,请使用。
问题内容: 我有标准ISO 8601格式的日期/时间值,例如 2010-07-26T11:37:52Z 。 我想要日期 为2010年7月26日(dd-mon-yyyy) 。我该怎么做? 问题答案: 构造两个SimpleDateFormat对象。首先,您将值从()解析为Date对象,第二次用于将Date对象转换为字符串,例如 解析可能会引发ParseException,因此您需要捕获并处理它。
我们可以看到格式化就是通过格式字符串得到特定格式: format!("{}", foo) -> "3735928559" format!("0x{:X}", foo) -> "0xDEADBEEF" format!("0o{:o}", foo) -> "0o33653337357" 根据使用的参数类型,同样的变量(foo)能够格式化成不同的形式:X, o 和未指定形式。 这个格式化的功能是通过 t