java 对象list使用stream根据某一个属性转换成map的几种方式

可以使用Java 8中的Stream API将List转换为Map,并根据某个属性作为键或值。以下是一些示例代码:

将List转换为Map,键为某个属性,值为对象本身

List<Person> personList = ... // 假设这是一个Person对象列表
Map<String, Person> personMap = personList.stream()
        .collect(Collectors.toMap(Person::getName, Function.identity()));

在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象本身。

将List转换为Map,键为对象本身,值为某个属性


List<Person> personList = ... // 假设这是一个Person对象列表
Map<Person, String> personMap = personList.stream()
        .collect(Collectors.toMap(Function.identity(), Person::getAddress));

在这个示例中,将Person对象列表转换为Map,其中键为Person对象本身,值为Person对象的address属性。

将List转换为Map,键为某个属性,值为另一个属性

List<Person> personList = ... // 假设这是一个Person对象列表
Map<String, String> personMap = personList.stream()
        .collect(Collectors.toMap(Person::getName, Person::getAddress));

在这个示例中,将Person对象列表转换为Map,其中键为Person对象的name属性,值为Person对象的address属性。

无论使用哪种方式,都可以使用Java 8的Stream API将List转换为Map,并根据某个属性作为键或值。需要注意的是,在将List转换为Map时,键必须是唯一的,否则将会抛出异常。

### Java 流列表根据特定属性去重 在 Java 中,可以通过多种方式实现基于对象特定属性的去重操作。以下是几种常见且有效的方法: #### 使用 `Collectors.toMap` 实现去重 这种方法通过将流中的元素映射到一个临时的 `Map` 来确保唯一性,最后再转换回列表形式。 ```java import java.util.*; import java.util.stream.Collectors; class MyClass { private String attr1; private String attr2; public MyClass(String attr1, String attr2) { this.attr1 = attr1; this.attr2 = attr2; } public String getAttr1() { return attr1; } public String getAttr2() { return attr2; } @Override public String toString() { return "MyClass{" + "attr1='" + attr1 + '\'' + ", attr2='" + attr2 + '\'' + '}'; } } public class Main { public static void main(String[] args) { List<MyClass> list = Arrays.asList( new MyClass("a", "b"), new MyClass("c", "d"), new MyClass("a", "b") // duplicate entry ); Map<String, MyClass> map = list.stream() .collect(Collectors.toMap(o -> o.getAttr1() + "-" + o.getAttr2(), Function.identity(), (existing, replacement) -> existing)); List<MyClass> distinctList = new ArrayList<>(map.values()); System.out.println(distinctList); } } ``` 此代码片段展示了如何利用 `toMap()` 方法来创建键唯一的映射表,并最终收集不重复的对象实例[^1]。 #### 利用 `distinct()` 结合自定义比较器 当需要依据多个字段进行判断时,可以直接覆盖类内的 `equals()` 和 `hashCode()` 方法;或者,在流管道内提供定制化的逻辑来进行筛选。 ```java import java.util.*; import java.util.stream.Collectors; public class DistinctExample { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("John", 30), new Person("Jane", 25), new Person("John", 30), // Duplicate person based on name and age. new Person("Bob", 40) ); List<Person> uniquePeople = people.stream() .collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName).thenComparing(Person::getAge))), ArrayList::new)); uniquePeople.forEach(System.out::println); } } class Person implements Comparable<Person> { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() {return name;} public int getAge() {return age;} @Override public boolean equals(Object obj) { if (!(obj instanceof Person)) return false; Person other = (Person)obj; return Objects.equals(name, other.getName()) && age == other.getAge(); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } @Override public int compareTo(Person p) { int cmpName = this.name.compareTo(p.getName()); return cmpName != 0 ? cmpName : Integer.compare(this.age, p.getAge()); } } ``` 这段程序说明了怎样借助于 `TreeSet` 及其内置排序机制配合 `Comparable` 接口完成多条件下的去重工作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值