Использование оператора возврата в потоке Java - PullRequest
0 голосов
/ 15 февраля 2019

Привет, у меня есть две реализации некоторого фрагмента кода, где я изменяю строки с использованием потока 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());

Я хочу знать, есть ли разница в производительности между методом один и методом два.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Когда тело лямбда-функции представляет собой одно единственное выражение, компилятор определяет тип возвращаемого значения и значение из этого выражения.

Это просто синтаксический сахар.

0 голосов
/ 15 февраля 2019

Нет.Это скомпилирует по существу тот же байт-код.Вторая версия - просто более краткий способ ее записи.

Пример кода:

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

Соответствующий лямбда-байт-код:

  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;но это, вероятно, не имеет значения, поскольку его можно просто оптимизировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...