stream操作集合保留集合中重复值

本文提供了一段Java代码示例,展示了如何通过Stream API结合Collectors工具类来去除List集合中的重复元素,仅保留出现一次的非重复项,并最终打印出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例代码如下:思路是先转map找出非重复元素并删除。

仅供参考

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("a");
        list.add("b");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("d");
        list.removeAll(list.stream()
                .collect(Collectors.toMap(e -> e, e -> 1, Integer::sum))
                .entrySet().stream()
                .filter(entry -> entry.getValue() == 1)
                .map(Map.Entry::getKey)
                .collect(Collectors.toList()));
        list.forEach(System.out::println);
    }

### 将 Stream 集合转换为 Map 在 Java 8 中,`Stream` 接口提供了多种收集器来实现不同类型的数据结构转换。为了将 `Stream` 转换为 `Map`,可以使用 `Collectors.toMap()` 方法[^1]。 此方法接收两个参数:一个是键映射函数,另一个是值映射函数;还可以接受第三个参数作为解决键冲突的方式(当多个元素具有相同的键时)。下面展示了一个具体的例子: ```java import java.util.*; import java.util.stream.Collectors; public class StreamToMapExample { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("Alice", 30), new Person("Bob", 25), new Person("Charlie", 35) ); // 使用 toMap() 收集器创建一个从名字到年龄的映射 Map<String, Integer> nameAgeMap = people.stream() .collect(Collectors.toMap( Person::getName, Person::getAge)); System.out.println(nameAgeMap); } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } ``` 上述代码片段定义了一个简单的 `Person` 类,创建了一些实例组成的列表。接着利用 `stream()` 和 `toMap()` 来构建一个由姓名指向对应年龄的地图对象[^2]。 如果存在重复键的情况,则可以通过指定合逻辑来处理这种情况。例如,在上面的例子中加入另一名叫做“Alice”的成员,那么就需要提供额外的二元运算符来决定如何处理这种冲突情况: ```java .collect(Collectors.toMap( Person::getName, Person::getAge, (existing, replacement) -> existing)); // 或者其他自定义规则 ``` 这段代码会保留第一次遇到的那个"Alice"对应的值而忽略后续相同名称的人。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值