java如何使用return,在java流中使用return语句

您有两个实现一些代码我在使用Java流修改字符串:

final List strings = new ArrayList<>();

strings.add("abc");

strings.add("bca");

strings.add("xyz");

Method 1:

final List modifiedStrings = strings.stream().map(a -> {

String abc;

abc = a.replace("a", "*");

return abc;

}).collect(Collectors.toList());

Method 2:

final List modifiedStrings2 = strings.stream().map(a ->

a.replace("a", "*")).collect(Collectors.toList());

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

解决方法:

不会.这将编译为基本相同的字节码.第二个版本只是一种更简洁的编写方式.

示例代码:

void foo(List strings) {

strings.stream()

.map(

a -> {

String abc;

abc = a.replace("a", "*");

return abc;

})

.collect(Collectors.toList());

}

void bar(List 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

所以,字节码并不完全相同 – 在foo案例中有一个额外的astore_1和aload_1;但这可能无关紧要,因为它可以被优化掉.

标签:java,java-stream

来源: https://codeday.me/bug/20190713/1445669.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值