您好,我有两个实现部分代码,其中我使用Java流修改了字符串:
final List<String> strings = new ArrayList<>();
strings.add("abc");
strings.add("bca");
strings.add("xyz");
Method 1:
final List<String> modifiedStrings = strings.stream().map(a -> {
String abc;
abc = a.replace("a", "*");
return abc;
}).collect(Collectors.toList());
Method 2:
final List<String> modifiedStrings2 = strings.stream().map(a ->
a.replace("a", "*")).collect(Collectors.toList());
我想知道方法一和方法二之间是否存在性能差异。
答案 0 :(得分:15)
不。这将编译为基本相同的字节码。第二个版本只是一种更简洁的编写方式。
示例代码:
void foo(List<String> strings) {
strings.stream()
.map(
a -> {
String abc;
abc = a.replace("a", "*");
return abc;
})
.collect(Collectors.toList());
}
void bar(List<String> strings) {
strings.stream().map(a -> a.replace("a", "*")).collect(Collectors.toList());
}
对应的lambda字节码:
private static java.lang.String lambda$bar$1(java.lang.String);
descriptor: (Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: ldc #8 // String a
3: ldc #9 // String *
5: invokevirtual #10 // Method java/lang/String.replace:(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
8: areturn
LineNumberTable:
line 18: 0
private static java.lang.String lambda$foo$0(java.lang.String);
descriptor: (Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=3, locals=2, args_size=1
0: aload_0
1: ldc #8 // String a
3: ldc #9 // String *
5: invokevirtual #10 // Method java/lang/String.replace:(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
8: astore_1
9: aload_1
10: areturn
LineNumberTable:
line 11: 0
line 12: 9
因此,字节码不是完全相同的-在astore_1
情况下有一个额外的aload_1
和foo
;但这可能无关紧要,因为可以对其进行优化。
答案 1 :(得分:1)
当lambda函数的主体只是一个表达式时,编译器将从该表达式中确定return type and value。
这只是语法糖。