java - Create map removing duplicate from list based on condition
问题描述
I want to get a list without duplication based on a condition using java 8, lambda expressions. Let's say I have the following code:
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Main {
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setName(int age) {
this.age = age;
}
}
public static void main(String[] args) {
Main main = new Main();
main.createList();
}
public void createList() {
List<Person> p = new ArrayList<Person>();
p.add(new Person("william", 34));
p.add(new Person("billie", 62));
p.add(new Person("Loise", 37));
p.add(new Person("Margot", 12));
p.add(new Person("billie", 63));
p.add(new Person("billie", 61));
System.out.println("show People initially");
show(p);
// It's going to be duplicated when it has the same name
// It'll keep the older person. For example, for billie it should keep billie -> 63
p = removeDuplicate(p, person -> buildPersonKey(person));
System.out.println("show People After");
show(p);
}
public void show(List<Person> pList) {
for (Person p: pList) {
System.out.println(p.getName() + "-Age: " + p.getAge());
}
}
public <T> List<T> removeDuplicate(List<T> dataList, Function<? super T, ?> keyFunction) {
return
new ArrayList<>(dataList.stream()
.collect(Collectors.toMap(
p -> (keyFunction.apply(p)),
p -> p,
(oldValue, newValue) -> newValue))
.values());
}
public String buildPersonKey(Person p) {
return p.getName();
}
}
This is my current output:
show People initially
william-Age: 34
billie-Age: 62
Loise-Age: 37
Margot-Age: 12
billie-Age: 63
billie-Age: 61
show People After
william-Age: 34
billie-Age: 61 // Here I want "billie-Age: 63"
Loise-Age: 37
Margot-Age: 12
This line (oldValue, newValue) -> newValue))
is the key, but here what I'd need it's a if expression, something like mapValueOld.getAge() > mapValueNew.getAge() ? mapValueOld.getAge() : mapValueNew.getAge()
Any idea how can I get this? Thanks
解决方案
由于您的removeDuplicate
方法是通用的,因此您必须将一个函数传递给它,该函数在具有相同键的两个元素之间进行选择:
public <T> List<T> removeDuplicate(List<T> dataList, Function<? super T, ?> keyFunction, BinaryOperator<T> chooser) {
return
new ArrayList<>(dataList.stream()
.collect(Collectors.toMap(keyFunction,
Function.identity(),
chooser))
.values());
}
并使用以下方法调用该方法:
p = removeDuplicate(p,
person -> buildPersonKey(person),
(p1,p2) -> p1.getAge() >= p2.getAge() ? p1 : p2);
推荐阅读
- python-3.x - 在 Python 中,是否有更简单的方法来遍历两个不同大小的列表?
- html - justify-content-center 在轮播上不起作用
- vue.js - Vue 嵌套转换无法按预期工作
- redux-mock-store - 使用 jest 模拟多个 Axios 调用
- python - Urlib 在一台机器上抛出 HTTP 错误 503 但在另一台机器上没有
- javascript - 进度条的滚动事件侦听器,用于 div,而不是主体(vanilla js)
- python - 当在 0 之前还有年份时,如何将带有“-”的日期字符串转换为整数
- javascript - Java Script AG Grid 获取行节点 ID
- javascript - 返回数组谷歌脚本网络的问题
- c# - 如何在 C# 中更改 ResourceDictionary 上的 setter 属性