For loop 替换kotlin中搜索列表的for循环

For loop 替换kotlin中搜索列表的for循环,for-loop,kotlin,apply,inline,For Loop,Kotlin,Apply,Inline,我正在尝试使用Kotlin的内置函数尽可能干净地转换代码。我已经使用for循环完成了部分代码。但我想知道用于此应用程序的高效内置函数 我有两个数组列表帐户和卡。 我的目标是在名为cards的数组列表中,借助其卡号搜索一张特定的卡。 然后我必须验证pin。如果pin是正确的,通过获取礼品卡的客户ID我必须在数组列表中搜索帐户。然后我必须更新账户的余额 这些是我用过的班级 class Account{ constructor( ) var id : String = generate

我正在尝试使用
Kotlin的内置
函数尽可能干净地转换代码。我已经使用
for循环
完成了部分代码。但我想知道用于此应用程序的高效内置函数

我有两个
数组列表
帐户
。 我的目标是在名为cards的数组列表中,借助其
卡号
搜索一张特定的卡。
然后我必须
验证pin
。如果pin是
正确的
,通过获取
礼品卡的
客户ID
我必须
数组列表中搜索
帐户
。然后我必须
更新
账户的
余额

这些是我用过的班级

class Account{
    constructor( )
    var id : String = generateAccountNumber()
    var name: String? = null
        set(name) = if (name != null) field = name.toUpperCase() else { field = "Unknown User"; println("invalid details\nAccount is not Created");}
    var balance : Double = 0.0
        set(balance) = if (balance >= 0) field = balance else { field = 0.0 }
    constructor(id: String = generateAccountNumber(), name: String?,balance: Double) {
        this.id = id
        this.balance = balance
        this.name = name
    }
}

class GiftCard {
    constructor( )
    var cardNumber : String = generateCardNumber()
    var pin: String? = null
        set(pin) = if (pin != null) field = pin else { field = "Unknown User"; println("Please set the pin\nCard is not Created");}
    var customerId : String = ""
        set(customerId) = if (customerId != "") field = customerId else { field = "" }
    var cardBalance : Double = 0.0
        set(cardBalance) = if (cardBalance > 0) field = cardBalance else { field = 0.0; println("Card is created with zero balance\nPlease deposit") }
    var status = Status.ACTIVE
    constructor(cardNumber: String = generateCardNumber(),
                pin: String,
                customerId: String,
                cardBalance: Double = 0.0,
                status: Status = Status.ACTIVE){
        this.cardNumber = cardNumber
        this.pin = pin
        this.customerId = customerId
        this.cardBalance = cardBalance
        this.status = status
    }
}
这是代码的一部分,我必须更改:


override fun closeCard(cardNumber: String, pin: String): Pair<Boolean, Boolean> {
        for (giftcard in giftcards) {
            if (giftcard.cardNumber == cardNumber) {
                if (giftcard.pin == pin) {
                    giftcard.status = Status.CLOSED
                    for (account in accounts)
                        account.balance = account.balance + giftcard.cardBalance
                    giftcard.cardBalance = 0.0
                    return Pair(true,true)
                }
                \\invalid pin
                return Pair(true,false)
            }
        }
        \\card is not present
        return Pair(false,false)
    }

卡片(卡号:字符串,pin:字符串):配对{
for(giftcard中的giftcard){
if(giftcard.cardname==cardname){
if(giftcard.pin==pin){
giftcard.status=status.CLOSED
用于(账户中的账户)
account.balance=account.balance+giftcard.cardBalance
giftcard.cardBalance=0.0
返回对(true,true)
}
\\无效pin码
返回对(真、假)
}
}
\\信用卡不存在
返回对(假,假)
}

可能有一百万种不同的方法可以做到这一点,但这里有一种方法至少有一些我认为值得分享的语言功能:

fun closeCard(cardNumber: String, pin: String): Pair<Boolean, Boolean> {
  val giftCard = giftcards.find { it.cardNumber == cardNumber }
                    ?: return Pair(false, false)

  return if (giftCard.pin == pin) {
      giftCard.status = Status.CLOSED
      accounts.forEach {
        it.balance += giftCard.cardBalance
      }
      Pair(true, true)
  } else 
      Pair(true, false)
}
fun closeCard(卡号:String,pin:String):成对{
val giftCard=giftcards.find{it.cardNumber==cardNumber}
?:返回对(假,假)
返回if(giftCard.pin==pin){
giftCard.status=status.CLOSED
帐户。forEach{
it.balance+=giftCard.cardBalance
}
配对(对,对)
}否则
配对(真、假)
}
首先要注意的是,如果Elvis运算符-
?:
,如果表达式的左侧为
null,它将计算表达式的右侧。在这种情况下,如果
find
返回
null
,这相当于没有找到与所需卡号匹配的卡号,我们将立即返回
Pair(false,false)
。这是代码中的最后一步

从那里开始,这是非常直接的。如果PIN匹配,则使用
forEach
循环通过
accounts
列表并关闭卡。如果管脚不匹配,那么我们将直接转到
else
分支。在kotlin中,
if
可以用作表达式,因此我们可以简单地将
return
语句放在
if
之前,让它返回每个分支上最后一个表达式的结果

附言:我不会说这比你的方式更有效。这只是一种使用内置函数的方法——
find
forEach
——正如您所要求的,以及其他语言功能


PPS:我强烈建议尝试并找到另一种方法来更新列表,而不改变对象。我不知道您的用例,但这感觉不太线程安全。我没有发布任何解决方案,因为它超出了这个问题的范围。

可能有一百万种不同的方法可以做到这一点,但这里有一种方法至少有一些我认为值得分享的语言功能:

fun closeCard(cardNumber: String, pin: String): Pair<Boolean, Boolean> {
  val giftCard = giftcards.find { it.cardNumber == cardNumber }
                    ?: return Pair(false, false)

  return if (giftCard.pin == pin) {
      giftCard.status = Status.CLOSED
      accounts.forEach {
        it.balance += giftCard.cardBalance
      }
      Pair(true, true)
  } else 
      Pair(true, false)
}
fun closeCard(卡号:String,pin:String):成对{
val giftCard=giftcards.find{it.cardNumber==cardNumber}
?:返回对(假,假)
返回if(giftCard.pin==pin){
giftCard.status=status.CLOSED
帐户。forEach{
it.balance+=giftCard.cardBalance
}
配对(对,对)
}否则
配对(真、假)
}
首先要注意的是,如果Elvis运算符-
?:
,如果表达式的左侧为
null,它将计算表达式的右侧。在这种情况下,如果
find
返回
null
,这相当于没有找到与所需卡号匹配的卡号,我们将立即返回
Pair(false,false)
。这是代码中的最后一步

从那里开始,这是非常直接的。如果PIN匹配,则使用
forEach
循环通过
accounts
列表并关闭卡。如果管脚不匹配,那么我们将直接转到
else
分支。在kotlin中,
if
可以用作表达式,因此我们可以简单地将
return
语句放在
if
之前,让它返回每个分支上最后一个表达式的结果

附言:我不会说这比你的方式更有效。这只是一种使用内置函数的方法——
find
forEach
——正如您所要求的,以及其他语言功能


PPS:我强烈建议尝试并找到另一种方法来更新列表,而不改变对象。我不知道您的用例,但这感觉不太线程安全。我没有为此发布任何解决方案,因为它超出了这个问题的范围。

这两个类都不是很习惯用法。Kotlin类的主构造函数是隐式的,不需要定义,但是,您显式定义了一个构造函数,因此添加了另一个空构造函数

// good
class C

// bad
class C {
    constructor()
}
更进一步,Kotlin已经命名了参数和默认值,所以请使用它们

class Account(
    val id: String = generateAccountNumber(),
    val name: String = "Unknown User",
    val balance: Double = 0.0
)
由于它的缺点,
Double
基本上是一个非常糟糕的选择,例如选择
Int
Long
,甚至
BigDecimal
都会更好。似乎你也不希望余额低于零,在这种情况下考虑<代码>