Những gì tôi muốn đạt được với thụt lề lambda là như sau:
Câu lệnh nhiều dòng:
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);
Câu lệnh một dòng:
List<String> strings = Arrays.stream(ppl)
.map((x) -> x.toUpperCase())
.filter((x) -> x.contains("(M)"))
.collect(Collectors.toList());
Hiện tại, Eclipse đang tự động định dạng như sau:
Câu lệnh nhiều dòng:
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);
Câu lệnh một dòng:
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);
Và tôi thấy điều này thực sự lộn xộn, bởi vì cách collect
gọi nằm ngay bên dưới return
và không có khoảng trống nào ở giữa. Tôi sẽ thích nó hơn nếu tôi có thể bắt đầu lambda trong một dòng mới được thụt lề và để lệnh .filter(
gọi sẽ ở ngay phía trên lệnh .collect(
gọi. Tuy nhiên, thứ duy nhất có thể được tùy chỉnh với Java-8 Eclipse Formatter tiêu chuẩn là ()
dấu ngoặc nhọn ở đầu thân lambda, nhưng không có gì cho dấu ngoặc trước đó, cũng không phải thụt lề.
Và trong trường hợp gọi một dòng, nó chỉ sử dụng đường bọc cơ bản và làm cho nó trở thành một chuỗi hỗn độn. Tôi không nghĩ rằng tôi cần giải thích lý do tại sao điều này khó giải mã sau đó.
Có cách nào để tùy chỉnh định dạng nhiều hơn và đạt được kiểu định dạng đầu tiên trong Eclipse không? (Hoặc, tùy chọn, trong IDE khác như IntelliJ IDEA.)
CHỈNH SỬA: Phiên bản gần nhất mà tôi có thể nhận được là với IntelliJ IDEA 13 Community Edition (đọc: phiên bản miễn phí: P) như sau (được xác định bằng cách thụt lề liên tục, trong trường hợp này là 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);
Nó cũng cho phép "căn chỉnh" lệnh gọi phương thức chuỗi như thế này:
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);
}
Cá nhân tôi thấy rằng mặc dù nó có ý nghĩa hơn, nhưng phiên bản thứ hai đẩy nó đi quá xa, vì vậy tôi thích phiên bản đầu tiên hơn.
Thiết lập chịu trách nhiệm cho thiết lập đầu tiên như sau:
<?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>
Tôi đã cố gắng đảm bảo mọi thứ đều hợp lý, nhưng tôi có thể đã làm sai một thứ gì đó, vì vậy nó có thể cần những điều chỉnh nhỏ.
Nếu bạn là người Hungary như tôi và bạn đang sử dụng bố cục Hungary, thì sơ đồ bàn phím này có thể hữu ích cho bạn, để bạn không thể sử dụng AltGR + F, AltGR + G, AltGR + B , AltGR + N và AltGR + M (tương ứng với 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>
Mặc dù IntelliJ dường như không cung cấp cách đặt dấu ngoặc nhọn mở của lambda vào một dòng mới, nhưng đó là một cách định dạng khá hợp lý, vì vậy tôi sẽ đánh dấu điều này là được chấp nhận.
.filter(x -> x.contains("(M)"))
? Đơn giản hơn nhiều ... Nếu bạn thực sự đang nói về những nơi bạn cần nhiều câu lệnh, thì tốt hơn là bạn nên đưa ra một ví dụ cần nó.