在java流中使用return语句

Jhu*_*ath 3 java java-stream

您有两个实现一些代码我在使用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());
Run Code Online (Sandbox Code Playgroud)

我想知道方法一和方法二之间是否存在任何性能差异.

Thi*_*ilo 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());
}
Run Code Online (Sandbox Code Playgroud)

对应的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
Run Code Online (Sandbox Code Playgroud)

因此,字节码是不是相同-有一个多余的astore_1,并aload_1foo情况; 但这可能无关紧要,因为它可以被优化掉.

  • @Thilo 实际上,它们不会编译为完全相同的字节码:在“bar”形式中有一个额外的“astore”和“aload”。叹。很抱歉跳出来编辑您的答案。请根据我的贡献做您的选择。 (2认同)
  • 由于问题的标题集中在 `return` 语句上,因此值得指出 `a -&gt; a.replace("a", "*")` 和 `a -&gt; { return a.replace("a", " *"); }` *do* 生成相同的字节码。它只是引入了一个附加的局部变量,它使用附加的局部变量创建代码。 (2认同)