假设,我有一个包含员工信息列表的列表。
val distinctEmployee = employees.distinctBy { it.firstName }
我希望创建一个函数并将其作为distinctBy方法的参数传递,这样我就可以将任何不同的方法应用到列表中。我希望是这样的。
val highSalaryEmployee = employees.filterBy(salaryFilter)
function salaryFilter(employee: Employee): Boolean {
return employee.salary > 350000
}
我以前用filterBy方法做过这件事,但是我不知道如何应用distictBy方法。
编辑:所以这是我曾经尝试过的,但仍然被困住了。
val distinctEmployee = employees.distinctBy { firstNameDistinct(it) }
function firstNameDistinct(employee: Employee): Boolean {
return employee. // what should be returned here?
}
发布于 2022-07-11 19:40:51
我被你想做的事弄糊涂了。如果你能澄清,我们就能找到答案。但是,我会用一些假设来回答。
首先,我认为distinctBy
所做的事情有些混乱。来自科特林博士
返回一个列表,该列表只包含来自给定数组的元素,该数组具有由给定选择器函数返回的不同的键。
因此,让我们以下面的代码为例:
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"
}
这将是输出:
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
(单数)名称--我假设您不想要一个列表,但是您想用给定的名称从列表中抓取一名员工。要做到这一点,您可以做如下事情:
val employee = employees.firstOrNull { it.name == "Bob" }
但是要知道,如果有多个胸部,你只会得到一个,它可能是“错误的”,这取决于你在做什么。你也可以:
val filteredEmployees = employees.filter { it.name == "Bob" }
但这会给你一个清单:
Name: Bob Salary: 75000
Name: Bob Salary: 45000
所以你也可以:
val employee = employees.firstOrNull { it.name == "Bob" && it.salary == 75000 }
但是,你仍然会遇到两名员工的名字和薪水相同的情况。我建议向员工添加某种唯一的ID,并对其执行firstOrNull
操作:
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"
}
输出:
Name: Bob Salary: 45000
https://stackoverflow.com/questions/72942414
复制相似问题