使用 lambda 删除列表中的元素

Dei*_*bys 1 java lambda

嗨,我想在 java 中使用 lambda 来删除列表中的重复元素。定义是否重复将通过自定义函数让我们假设我们有这些对象:

Object1(id:1 , name:"SEVERO" , grade:"A")
Object2(id:2 , name:"SEVERO" , grade:"B")
Object3(id:3 , name:"LUCY" , grade:"A")
Object4(id:4 , name:"LUCY" , grade:"A")
Object5(id:5 , name:"PAULA" , grade:"A")
Run Code Online (Sandbox Code Playgroud)


预期成绩:

Object2(id:2 , name:"SEVERO" , grade:"B")
Object3(id:3 , name:"LUCY" , grade:"A")
Object5(id:5 , name:"PAULA" , grade:"A")
Run Code Online (Sandbox Code Playgroud)

所以基本上如果有同名的对象,我只想保留其中一个。将保留的是等级最高的那个(等级顺序:A->B->C),如果等级有平局,任何物品都可以保留,没有偏好.

我如何使用 java lambda 做到这一点?

Ous*_* D. 5

我会和toMap收藏家一起去:

Collection<Student> result = source.stream()
                .collect(toMap(Student::getName, Function.identity(),
                        BinaryOperator.minBy(Comparator.comparing(Student::getGrade))))
                .values();
Run Code Online (Sandbox Code Playgroud)
  • source 是我们正在流式传输的集合。
  • Student 是源中的对象(当然这只是一个假设,您应该将其更改为集合中对象的名称)。
  • Student::getName 是用于提取地图键的 keyMapper。
  • Function.identity() 是用于提取地图值的 valueMapper。
  • BinaryOperator.minBy(Comparator.comparing(Student::getGrade)) 是用于在两个给定对象具有相同名称的情况下解决冲突的合并函数。
  • values 生成地图的值,因为我们不再关心键。

如果你想要一个List<T>而不是一个,Collection<T>那么可以随意将上述管道的结果传递给ArrayList<>(...)构造函数。