groovy - 如何将此 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
}
谢谢
解决方案
这是我的看法(我删除了对 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...
)
}
}
}
}
推荐阅读
- css - 光滑箭头中的背景图像不会出现
- java - 动态创建 JLabel
- c# - String[] 不包含 ToArray() 的定义,也没有扩展方法
- c# - 通过 C# 互操作打开 office word 2013 非常慢
- javascript - ReactJS:我可以在单独的组件中分离一个改变状态的函数吗?
- javascript - Angular7:如何评估算术字符串
- regex - 从R中数据框中的文本字符串中删除正则表达式
- office365 - 如何通过 REST API 检索 power bi 审计日志
- c# - 阅读开始前发送的消息?
- python - 如何将此类 [[a,b,c],[d,e,f]..........] 数据从 csv 文件加载到 python 中?