首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kotlin,我如何为distinctBy方法创建一个函数

Kotlin,我如何为distinctBy方法创建一个函数
EN

Stack Overflow用户
提问于 2022-07-11 17:24:20
回答 1查看 82关注 0票数 2

假设,我有一个包含员工信息列表的列表。

代码语言:javascript
运行
复制
val distinctEmployee = employees.distinctBy { it.firstName }

我希望创建一个函数并将其作为distinctBy方法的参数传递,这样我就可以将任何不同的方法应用到列表中。我希望是这样的。

代码语言:javascript
运行
复制
val highSalaryEmployee = employees.filterBy(salaryFilter)

function salaryFilter(employee: Employee): Boolean {
  return employee.salary > 350000
}

我以前用filterBy方法做过这件事,但是我不知道如何应用distictBy方法。

编辑:所以这是我曾经尝试过的,但仍然被困住了。

代码语言:javascript
运行
复制
val distinctEmployee = employees.distinctBy { firstNameDistinct(it) }

function firstNameDistinct(employee: Employee): Boolean {
  return employee. // what should be returned here?
}
EN

回答 1

Stack Overflow用户

发布于 2022-07-11 19:40:51

我被你想做的事弄糊涂了。如果你能澄清,我们就能找到答案。但是,我会用一些假设来回答。

首先,我认为distinctBy所做的事情有些混乱。来自科特林博士

返回一个列表,该列表只包含来自给定数组的元素,该数组具有由给定选择器函数返回的不同的键。

因此,让我们以下面的代码为例:

代码语言:javascript
运行
复制
fun test() {
    val employees = listOf(
        Employee("Bob", 75000),
        Employee("Jenna", 400000),
        Employee("Mark", 120000),
        Employee("Rebecca", 80000),
        Employee("Tanner", 30000),
        Employee("Bob", 45000)
    )
    
    val distinctEmployees = employees.distinctBy { it.name }
    distinctEmployees.forEach {
        println(it)
    }
}

class Employee(val name: String, val salary: Int) {
    override fun toString(): String = "Name: $name\tSalary: $salary"
}

这将是输出:

代码语言:javascript
运行
复制
Name: Bob   Salary: 75000
Name: Jenna Salary: 400000
Name: Mark  Salary: 120000
Name: Rebecca   Salary: 80000
Name: Tanner    Salary: 30000

请注意,这是一个列表,而不仅仅是一个员工-而Bob只显示了一次,即使最初有两个Bobs。基本上,employees.distinctBy { it.name }是说,“给我一个列表中所有员工的名单,但是只有唯一的名字,去掉任何有重复名字的雇员。”

现在出现了这样的假设--因为您使用的是employee (单数)名称--我假设您不想要一个列表,但是您想用给定的名称从列表中抓取一名员工。要做到这一点,您可以做如下事情:

代码语言:javascript
运行
复制
val employee = employees.firstOrNull { it.name == "Bob" }

但是要知道,如果有多个胸部,你只会得到一个,它可能是“错误的”,这取决于你在做什么。你也可以:

代码语言:javascript
运行
复制
val filteredEmployees = employees.filter { it.name == "Bob" }

但这会给你一个清单:

代码语言:javascript
运行
复制
Name: Bob   Salary: 75000
Name: Bob   Salary: 45000

所以你也可以:

代码语言:javascript
运行
复制
val employee = employees.firstOrNull { it.name == "Bob" && it.salary == 75000 }

但是,你仍然会遇到两名员工的名字和薪水相同的情况。我建议向员工添加某种唯一的ID,并对其执行firstOrNull操作:

代码语言:javascript
运行
复制
fun test() {
    val employees = listOf(
        Employee("1234", "Bob", 75000),
        Employee("5678", "Jenna", 400000),
        Employee("9123", "Mark", 120000),
        Employee("4567", "Rebecca", 80000),
        Employee("8912", "Tanner", 30000),
        Employee("3456", "Bob", 45000)
    )
    
    // val employee = employees.filter { it.name == "Bob" }
    val employee = employees.firstOrNull { it.employeeID == "3456" }
    println(employee)
}

class Employee(val employeeID: String, val name: String, val salary: Int) {
    override fun toString(): String = "Name: $name\tSalary: $salary"
}

输出:

代码语言:javascript
运行
复制
Name: Bob   Salary: 45000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72942414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档