将Kotlin集合(.find,.map)转换为Java



我需要将以下kotlin代码转换为java:

private fun processPurchases(allPurchases: List<Purchase>, purchasedProductsFetched: Boolean) {
val validPurchases = allPurchases.filter {
isPurchaseSignatureValid(it)
}.map { purchase ->
val skuDetails = fetchedSkuInfosList.find { it.skuId == purchase.sku }!!.skuDetails
PurchaseInfo(
generateSkuInfo(skuDetails),
purchase
)
}
}

我被困在.map部分之后,不知道发生了什么…

private void processPurchases(List<Purchase> allPurchases, boolean purchasedProductsFetched) {

List<Purchase> validPurchases = new ArrayList<>();
for (Purchase purchase : allPurchases) {
if (isPurchaseSignatureValid(purchase)) {
validPurchases.add(purchase);
}
}
}

有人能解释下一步该做什么吗?

您还可以利用Java流,并采用更具功能性的方法:

void process(List<Purchase> allPurchases, Boolean purchasedProductsFetched) {
List<PurchaseInfo> validPurchases = allPurchases
.stream()
.filter(this::isPurchaseSignatureValid)
.map(purchase ->
new PurchaseInfo(
fetchedSkuInfosList
.stream()
.filter(it -> it.getSkuId().equals(purchase.getSku()))
.findFirst()
.get()//the get here is as unsafe as the !! in kotlin
.getSkuDetails(),
purchase
)
).collect(Collectors.toList());
}

注意,这复制了给定kotlin代码中的错误。!!、未使用的purchasedProductsFetched属性和未使用的validPurchases的空安全问题。

首先,validPurchases列表需要PurchaseInfo类型,而不是od Purchase。所以你需要这样写smth:

validPurchases.add(PurchaseInfo(generateSkuInfo(skuDetails),purchase));

@Konrad pÉkala的回答帮助我理解了该往哪个方向看。

private void processPurchases(List<Purchase> allPurchases, boolean purchasedProductsFetched) {
if (!allPurchases.isEmpty()) {
List<PurchaseInfo> validPurchases = new ArrayList<>();
for (Purchase purchase : allPurchases) {
if (isPurchaseSignatureValid(purchase)) {
for (SkuInfo skuInfo : fetchedSkuInfoList) {
if (skuInfo.getSkuId().equals(purchase.getSku())) {
SkuDetails skuDetails = skuInfo.getSkuDetails();
PurchaseInfo purchaseInfo = new PurchaseInfo(generateSkuInfo(skuDetails), purchase);
validPurchases.add(purchaseInfo);
}
}
}
}

}
}

最新更新