首页 > 解决方案 > 如何从 kotlin 源文件中获取优化的 java 代码?

问题描述

我已经从现有选项转换了下面的 kotlin 文件

  @Entity
data class DatabaseVideo constructor(
        @PrimaryKey
        val url: String,
        val updated: String,
        val title: String,
        val description: String,
        val thumbnail: String)

/**
 * Map DatabaseVideos to domain entities
 */
fun List<DatabaseVideo>.asDomainModel(): List<DevByteVideo> {
    return map {
        DevByteVideo(
                url = it.url,
                title = it.title,
                description = it.description,
                updated = it.updated,
                thumbnail = it.thumbnail)
    }
}

Java 输出文件如下

@Metadata(
   mv = {1, 1, 18},
   bv = {1, 0, 3},
   k = 2,
   d1 = {"\u0000\u0010\n\u0000\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\u001a\u0016\u0010\u0000\u001a\b\u0012\u0004\u0012\u00020\u00020\u0001*\b\u0012\u0004\u0012\u00020\u00030\u0001¨\u0006\u0004"},
   d2 = {"asDomainModel", "", "Lcom/example/android/devbyteviewer/domain/DevByteVideo;", "Lcom/example/android/devbyteviewer/database/DatabaseVideo;", "app_debug"}
)
public final class DatabaseEntitiesKt {
   @NotNull
   public static final List asDomainModel(@NotNull List $this$asDomainModel) {
      Intrinsics.checkParameterIsNotNull($this$asDomainModel, "$this$asDomainModel");
      Iterable $this$map$iv = (Iterable)$this$asDomainModel;
      int $i$f$map = false;
      Collection destination$iv$iv = (Collection)(new ArrayList(CollectionsKt.collectionSizeOrDefault($this$map$iv, 10)));
      int $i$f$mapTo = false;
      Iterator var6 = $this$map$iv.iterator();

      while(var6.hasNext()) {
         Object item$iv$iv = var6.next();
         DatabaseVideo it = (DatabaseVideo)item$iv$iv;
         int var9 = false;
         String var10002 = it.getUrl();
         String var10003 = it.getTitle();
         String var10004 = it.getDescription();
         String var10005 = it.getUpdated();
         String var10 = it.getThumbnail();
         String var11 = var10005;
         String var12 = var10004;
         String var13 = var10003;
         String var14 = var10002;
         DevByteVideo var16 = new DevByteVideo(var13, var12, var14, var11, var10);
         destination$iv$iv.add(var16);
      }

      return (List)destination$iv$iv;
   }
}
// DatabaseVideo.java
package com.example.android.devbyteviewer.database;

import androidx.room.Entity;
import androidx.room.PrimaryKey;
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

@Metadata(
   mv = {1, 1, 18},
   bv = {1, 0, 3},
   k = 1,
   d1 = {"\u0000\"\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0012\n\u0002\u0010\u000b\n\u0002\b\u0002\n\u0002\u0010\b\n\u0002\b\u0002\b\u0087\b\u0018\u00002\u00020\u0001B-\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0003\u0012\u0006\u0010\u0005\u001a\u00020\u0003\u0012\u0006\u0010\u0006\u001a\u00020\u0003\u0012\u0006\u0010\u0007\u001a\u00020\u0003¢\u0006\u0002\u0010\bJ\t\u0010\u000f\u001a\u00020\u0003HÆ\u0003J\t\u0010\u0010\u001a\u00020\u0003HÆ\u0003J\t\u0010\u0011\u001a\u00020\u0003HÆ\u0003J\t\u0010\u0012\u001a\u00020\u0003HÆ\u0003J\t\u0010\u0013\u001a\u00020\u0003HÆ\u0003J;\u0010\u0014\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u00032\b\b\u0002\u0010\u0005\u001a\u00020\u00032\b\b\u0002\u0010\u0006\u001a\u00020\u00032\b\b\u0002\u0010\u0007\u001a\u00020\u0003HÆ\u0001J\u0013\u0010\u0015\u001a\u00020\u00162\b\u0010\u0017\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0018\u001a\u00020\u0019HÖ\u0001J\t\u0010\u001a\u001a\u00020\u0003HÖ\u0001R\u0011\u0010\u0006\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\t\u0010\nR\u0011\u0010\u0007\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u000b\u0010\nR\u0011\u0010\u0005\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\f\u0010\nR\u0011\u0010\u0004\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\r\u0010\nR\u0016\u0010\u0002\u001a\u00020\u00038\u0006X\u0087\u0004¢\u0006\b\n\u0000\u001a\u0004\b\u000e\u0010\n¨\u0006\u001b"},
   d2 = {"Lcom/example/android/devbyteviewer/database/DatabaseVideo;", "", "url", "", "updated", "title", "description", "thumbnail", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", "getDescription", "()Ljava/lang/String;", "getThumbnail", "getTitle", "getUpdated", "getUrl", "component1", "component2", "component3", "component4", "component5", "copy", "equals", "", "other", "hashCode", "", "toString", "app_debug"}
)
@Entity
public final class DatabaseVideo {
   @PrimaryKey
   @NotNull
   private final String url;
   @NotNull
   private final String updated;
   @NotNull
   private final String title;
   @NotNull
   private final String description;
   @NotNull
   private final String thumbnail;

   @NotNull
   public final String getUrl() {
      return this.url;
   }

   @NotNull
   public final String getUpdated() {
      return this.updated;
   }

   @NotNull
   public final String getTitle() {
      return this.title;
   }

   @NotNull
   public final String getDescription() {
      return this.description;
   }

   @NotNull
   public final String getThumbnail() {
      return this.thumbnail;
   }

   public DatabaseVideo(@NotNull String url, @NotNull String updated, @NotNull String title, @NotNull String description, @NotNull String thumbnail) {
      Intrinsics.checkParameterIsNotNull(url, "url");
      Intrinsics.checkParameterIsNotNull(updated, "updated");
      Intrinsics.checkParameterIsNotNull(title, "title");
      Intrinsics.checkParameterIsNotNull(description, "description");
      Intrinsics.checkParameterIsNotNull(thumbnail, "thumbnail");
      super();
      this.url = url;
      this.updated = updated;
      this.title = title;
      this.description = description;
      this.thumbnail = thumbnail;
   }

   @NotNull
   public final String component1() {
      return this.url;
   }

   @NotNull
   public final String component2() {
      return this.updated;
   }

   @NotNull
   public final String component3() {
      return this.title;
   }

   @NotNull
   public final String component4() {
      return this.description;
   }

   @NotNull
   public final String component5() {
      return this.thumbnail;
   }

   @NotNull
   public final DatabaseVideo copy(@NotNull String url, @NotNull String updated, @NotNull String title, @NotNull String description, @NotNull String thumbnail) {
      Intrinsics.checkParameterIsNotNull(url, "url");
      Intrinsics.checkParameterIsNotNull(updated, "updated");
      Intrinsics.checkParameterIsNotNull(title, "title");
      Intrinsics.checkParameterIsNotNull(description, "description");
      Intrinsics.checkParameterIsNotNull(thumbnail, "thumbnail");
      return new DatabaseVideo(url, updated, title, description, thumbnail);
   }

   // $FF: synthetic method
   public static DatabaseVideo copy$default(DatabaseVideo var0, String var1, String var2, String var3, String var4, String var5, int var6, Object var7) {
      if ((var6 & 1) != 0) {
         var1 = var0.url;
      }

      if ((var6 & 2) != 0) {
         var2 = var0.updated;
      }

      if ((var6 & 4) != 0) {
         var3 = var0.title;
      }

      if ((var6 & 8) != 0) {
         var4 = var0.description;
      }

      if ((var6 & 16) != 0) {
         var5 = var0.thumbnail;
      }

      return var0.copy(var1, var2, var3, var4, var5);
   }

   @NotNull
   public String toString() {
      return "DatabaseVideo(url=" + this.url + ", updated=" + this.updated + ", title=" + this.title + ", description=" + this.description + ", thumbnail=" + this.thumbnail + ")";
   }

   public int hashCode() {
      String var10000 = this.url;
      int var1 = (var10000 != null ? var10000.hashCode() : 0) * 31;
      String var10001 = this.updated;
      var1 = (var1 + (var10001 != null ? var10001.hashCode() : 0)) * 31;
      var10001 = this.title;
      var1 = (var1 + (var10001 != null ? var10001.hashCode() : 0)) * 31;
      var10001 = this.description;
      var1 = (var1 + (var10001 != null ? var10001.hashCode() : 0)) * 31;
      var10001 = this.thumbnail;
      return var1 + (var10001 != null ? var10001.hashCode() : 0);
   }

   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof DatabaseVideo) {
            DatabaseVideo var2 = (DatabaseVideo)var1;
            if (Intrinsics.areEqual(this.url, var2.url) && Intrinsics.areEqual(this.updated, var2.updated) && Intrinsics.areEqual(this.title, var2.title) && Intrinsics.areEqual(this.description, var2.description) && Intrinsics.areEqual(this.thumbnail, var2.thumbnail)) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }
   }
}

它似乎是越野车。很难理解。是否有任何选项可以获得纯 Java 代码?请让我知道我们是否可以执行除 android studio 以外的转换

标签: androidkotlin

解决方案


你必须意识到 kotlin 可以运行JVM,因此它可以做所有可以做的事情,仅此Java而已。提供的额外功能(Kotlin例如非空类型等)是使用 java 使用的相同字节码实现的。

所有你称之为“buggy”的额外java代码,都是为了满足kotlin的一些特定功能要求。

例如,所有Intrinsics.checkParameterIsNotNull检查都存在于声明为不可为空的变量上,这就是 kotlin 确保此类变量中不引入空值的方式。

因此,您看到的 java 输出不包含任何额外的代码,它是您的 kotlin 类的实际 java 等效代码。


推荐阅读