首页 > 解决方案 > 如何将此 Java lambda 代码转换为 Groovy 等效代码

问题描述

我有一个可行的方法,但需要将其转换为使用 Groovy,因为代码库都是 groovy。我也相信这可以使用 Groovy 更简洁地完成,但我更擅长使用 lambda,所以我首先尝试了,但我正在努力使用 Groovy 实现同样的目标。如果有人可以提供帮助,我将不胜感激。

这是代码:

 public ArrayList<GameCredits> getCreditsList(CreditGained 
                                           creditsAccumulated, 
     Players playerList) {
    List<GameCredits> credits = creditsAccumulated.credits
    List<GameCredit> newCredits = []
    boolean playerMatched
    //Match Players to their credits and create new credits for unmatched
    playerList.players.stream()
            .filter { Player player -> player.playerKey != null }
            .each { Player player ->
                 playerMatched = false
                 credits.stream()
                .filter { GameCredit credit -> (credit?.creditIdentifier && 

                      credit?.creditIdentifier.equals(player.playerKey)) }

            .each { GameCredit credit ->
               credit.rank = player.rank
               credit.playerEmail = player.emailAddress
               credit.firstName = player.firstName
               credit.lastName = player.lastName
               playerMatched = true
        }
        if(!playerMatched){
              GameCredit credit=new GameCredit()
              credit.rank = player.rank
              credit.playerEmail = player.emailAddress
              credit.firstName = player.firstName
              credit.lastName = player.lastName
              newcredits.push(newGameCredits)
        }
    }
    credits.addAll(newCredits)
    credits
}

这是我尝试过的,但我知道会有更好的方法。

public ArrayList<GameCredits> getCreditsList(CreditGained creditsAccumulated, 
     Players playerList) {
    List<GameCredits> credits = creditsAccumulated.credits
    List<GameCredit> newCredits = []
    boolean playerMatched
    //Match Players to their credits and create new credits for unmatched
    playerList.players.findAll
             { Player player -> player.playerKey != null }
            .each { Player player ->
                 playerMatched = false
                 credits
                .findAll { GameCredit credit -> (credit?.creditIdentifier && 
                 credit?.creditIdentifier.equals(player.playerKey)) }

            .each { GameCredit credit ->
               credit.rank = player.rank
               credit.playerEmail = player.emailAddress
               credit.firstName = player.firstName
               credit.lastName = player.lastName
               playerMatched = true
        }
        if(!playerMatched){
              GameCredit newGameCredits=new GameCredit()
              newGameCredits.rank = player.rank
              newGameCredits.playerEmail = player.emailAddress
              newGameCredits.firstName = player.firstName
              newGameCredits.lastName = player.lastName
              newcredits.push(newGameCredits)
        }
    }
    credits.addAll(newCredits)
    credits
}

谢谢

标签: groovy

解决方案


这是我的看法(我删除了对 CreditGained 的副作用):

List<GameCredits> collectCredits(CreditGained credits, Players players) {
  credits.credits + players.players.collectMany { Player player ->
    if (!player.playerKey) {
      Collections.emptyList() // quick exit for player without key
    } else {
      List<GameCredit> matches = player.credits.findAll {
        it?.creditIdentifier == player.playerKey
      }

      if (matches) {
        // return credit(s) matched to player (with updated metadata)
        matches.each { GameCredit credit ->
          credit.with {
            rank = player.rank
            lastName = player.lastName
            firstName = player.firstName
            playerEmail = player.emailAddress
          }
        }
      } else {
        // return 1 new credit for player
        new GameCredit(
          rank: player.rank,
          lastName: player.lastName,
          firstName: player.firstName,
          playerEmail: player.emailAddress,
          creditIdentifier: player.playerKey // guessing you want this too...
        )
      }
    }
  }
}

推荐阅读