Was ich mit Lambda-Einrückung erreichen möchte, ist Folgendes:
Mehrzeilige Anweisung:
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);
Einzeilige Anweisung:
List<String> strings = Arrays.stream(ppl)
.map((x) -> x.toUpperCase())
.filter((x) -> x.contains("(M)"))
.collect(Collectors.toList());
Derzeit formatiert Eclipse automatisch wie folgt:
Mehrzeilige Anweisung:
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);
Einzeilige Anweisung:
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);
Und ich finde das wirklich chaotisch, weil der collect
Anruf direkt unter dem ist return
und dazwischen überhaupt kein Platz ist. Ich würde es vorziehen, wenn ich das Lambda in einer neuen eingerückten Zeile starten könnte und der .filter(
Anruf direkt über dem .collect(
Anruf wäre. Das einzige, was mit dem Standard-Java-8-Eclipse-Formatierer angepasst werden kann, ist die Klammer am Anfang des Lambda-Körpers, aber nichts für die ()
Klammern im Voraus oder die Einrückung.
Und bei einzeiligen Anrufen wird nur der grundlegende Zeilenumbruch verwendet und es wird zu einem verketteten Durcheinander. Ich glaube nicht, dass ich erklären muss, warum dies später schwer zu entschlüsseln ist.
Gibt es eine Möglichkeit, die Formatierung irgendwie weiter anzupassen und den ersten Formatierungstyp in Eclipse zu erreichen? (Oder optional in einer anderen IDE wie IntelliJ IDEA.)
BEARBEITEN: Das nächste, was ich bekommen konnte, war mit IntelliJ IDEA 13 Community Edition (lesen: kostenlose Ausgabe: P), das das Folgende war (definiert durch fortlaufende Einrückung, in diesem Fall 8):
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);
Es ermöglicht auch das "Ausrichten" des verketteten Methodenaufrufs wie folgt:
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);
}
Ich persönlich finde, dass es zwar sinnvoller ist, die zweite Version es jedoch viel zu weit wegschiebt, daher bevorzuge ich die erste.
Das Setup, das für das erste Setup verantwortlich ist, ist das folgende:
<?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>
Ich habe versucht, sicherzustellen, dass alles in Ordnung ist, aber ich habe möglicherweise etwas durcheinander gebracht, sodass möglicherweise geringfügige Anpassungen erforderlich sind.
Wenn Sie wie ich ungarisch sind und ein ungarisches Layout verwenden, kann diese Keymap für Sie von Nutzen sein, damit Sie AltGR + F, AltGR + G, AltGR + B nicht verwenden können , AltGR + N und AltGR + M (entsprechend Strg + 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>
Während IntelliJ keine Möglichkeit zu bieten scheint, die öffnende Klammer des Lambda in eine neue Zeile zu setzen, ist dies ansonsten eine ziemlich vernünftige Art der Formatierung, daher werde ich dies als akzeptiert markieren.
.filter(x -> x.contains("(M)"))
? Viel einfacher ... Wenn Sie tatsächlich über Orte sprechen, an denen Sie mehrere Anweisungen benötigen, ist es besser, ein Beispiel anzugeben, das diese benötigt.