android - 如何从 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 以外的转换
解决方案
你必须意识到 kotlin 可以运行JVM
,因此它可以做所有可以做的事情,仅此Java
而已。提供的额外功能(Kotlin
例如非空类型等)是使用 java 使用的相同字节码实现的。
所有你称之为“buggy”的额外java代码,都是为了满足kotlin的一些特定功能要求。
例如,所有Intrinsics.checkParameterIsNotNull
检查都存在于声明为不可为空的变量上,这就是 kotlin 确保此类变量中不引入空值的方式。
因此,您看到的 java 输出不包含任何额外的代码,它是您的 kotlin 类的实际 java 等效代码。