Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java流中使用return语句_Java_Java Stream - Fatal编程技术网

在java流中使用return语句

在java流中使用return语句,java,java-stream,Java,Java Stream,您好,这里有两个实现,我正在使用Java stream修改字符串: 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 -> { Str

您好,这里有两个实现,我正在使用Java stream修改字符串:

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());
final List strings=new ArrayList();
字符串。添加(“abc”);
字符串。添加(“bca”);
字符串。添加(“xyz”);
方法1:
最终列表modifiedStrings=strings.stream().map(a->{
字符串abc;
abc=a.替换(“a”、“*”);
返回abc;
}).collect(Collectors.toList());
方法2:
最终列表modifiedStrings2=strings.stream().map(a->
a、 替换(“a”,“*”).collect(collector.toList());

我想知道方法一和方法二之间是否有任何性能差异。

否。这将编译成基本相同的字节码。第二个版本只是一种更简洁的写作方式

示例代码:

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());
}

因此,字节码并不完全相同-在
foo
的情况下,有一个额外的
astore\u 1
aload\u 1
;但是这可能是不相关的,因为它可以被优化掉。

当lambda函数的主体只是一个表达式时,编译器将根据该表达式确定所需的参数


这只是语法上的糖分。

可能没什么区别。在方法1中定义了1个额外的引用,即-8字节这可能会在编译后出现。你试过测量任何差异吗?@Thilo啊,是的。给我一点时间。@Thilo实际上,它们并没有编译成完全相同的字节码:在
栏中有一个额外的
astore
alod
。唉。很抱歉打断您的回答。请按照您的选择来处理我的贡献。由于问题的标题集中在
return
语句上,因此值得指出的是
a->a.replace(“a”、“*””)
a->{returna.replace(“a”、“*”);}
确实生成了相同的字节码。这只是引入了一个额外的局部变量,它使用一个额外的局部变量创建代码。而这个额外的局部变量(一开始成本很低)可能会通过JIT得到优化。因此,担心这是一种差异是非常愚蠢的(即使它没有得到优化)。
  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