java8 stream实现列表去重,java8的stream 和lambda的使用实例

java8 stream实现列表去重,java8的stream 和lambda的使用实例

不管我们做安卓开发还是javaweb开发,有时候我们会对列表进行去重操作,所谓的列表数据重复,通常体现在列表集合数据中的id属性相同。当然我们通过普通的方式也可以达到去重的效果。但是借助java8新特性可以很方便的实现列表去重,下面就写个小demo简单的演示一下。

主要实现代码

List<Person> persons = new ArrayList();
       List<Integer> ids = new ArrayList<>();//用来临时存储person的id
       persons.add(new Person(1, "name1", 10));
       persons.add(new Person(2, "name2", 21));
       persons.add(new Person(5, "name5", 55));
       persons.add(new Person(3, "name3", 34));
       persons.add(new Person(1, "name1", 10));

       List<Person> personList = persons.stream().filter(// 过滤去重
               v -> {
                   boolean flag = !ids.contains(v.getId());
                   ids.add(v.getId());
                   return flag;
               }
       ).collect(Collectors.toList());
       System.out.println(personList);
复制代码

运行后的打印如下.可以看出id为1时的重复数据已经被过滤掉了

[
Person{id=1, name='name1', age=10},
Person{id=2, name='name2', age=21}, 
Person{id=5, name='name5', age=55}, 
Person{id=3, name='name3', age=34}
]

复制代码

person类的代码如下

package com.qcl.demo;

/**
 * Created by qcl on 2018/3/26.
 */
public class Person {

    private int id;
    private String name;
    private int age;

    public Person() {
    }

    public Person(int id, String name, int age) {
        this.id = id;

        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' + ", age=" + age + '}'; } } 复制代码

这只是java8在我们开发时比较常用的一个操作。

如下面这个例子使用也比较普遍

获取person集合中的所有大于18周岁,并排序
List<Person> persons = new ArrayList();
persons.add(new Person(1, "name1", 10));
persons.add(new Person(2, "name2", 21));
persons.add(new Person(5, "name5", 55));
persons.add(new Person(3, "name3", 34));
persons.add(new Person(4, "name4", 6));
persons.stream()
        .filter(p -> p.getAge() >= 18)//获取所有18岁以上的用户
        .sorted(Comparator.comparing(Person::getAge))//依年纪升序排序
        .sorted(Comparator.comparing(Person::getAge).reversed())//依年纪降序排序
        .collect(Collectors.toList())
        .forEach(System.out::println);

boolean isAllAdult = persons.stream().
        allMatch(p -> p.getAge() > 18);
System.out.println("是否所有的用户都大于18岁" + isAllAdult);
复制代码

总结:java8的使用,对于我们操作集合,数组提供了很大的便利。建议大家有机会多去了解下java8的新特性。

转载于:https://juejin.im/post/5ab8baa66fb9a028c06ad0d2

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101748.html原文链接:https://javaforall.net

(0)
上一篇 2021年5月25日 下午2:00
下一篇 2021年5月25日 下午3:00


相关推荐

  • 小米手机解BL锁、线刷详细教程,适用于小米全系列手机[通俗易懂]

    小米手机解BL锁、线刷详细教程,适用于小米全系列手机[通俗易懂][教程]小米手机解BL锁、线刷详细教程,适用于小米全系列手机这几天看到论坛里很多人在问怎么线刷,下面我就做个详细的线教程大家看一下高手别喷我哈此教程只适合刷官方MIUI包进入正题。第一步:解BL锁1.浏览器打开申请解锁小米手机点击立即解锁,然后再点击下载解锁工具,下载后保存到电脑也可以点击这里立即下载2.解压后双击miflash_unlock.exe打开手机解锁工具V3.33.点同意,然后登陆帐号,手机会检测您的帐号是否可以解锁,如果不支持点击申请解锁,好像是大约一周左右可以通过申

    2022年6月7日
    85
  • Oracle触发器用法实例详解

    Oracle触发器用法实例详解oracle

    2022年7月11日
    18
  • 启发式搜索A * 算法

    启发式搜索A * 算法开篇这篇文章介绍找最短路径的一种算法 它的字我比较喜欢 启发式搜索 标题上写的是翻译 只是觉得原文讲解的思路很清晰 这篇文章整体构思和原文相差不多 只是有些地方有小的改动 我想的是用更容易理解的方式 更简洁的把 A 算法的思想呈现出来 文章中出现的词 openlist closelist 我觉得用原文会更好故没有翻译 在文中会有解释 原文地址 http www

    2026年3月16日
    2
  • php的opendir,phpopendir函数与opendir语法

    php的opendir,phpopendir函数与opendir语法opendir 语法 opendir path context 目录 功能说明 打开目录句柄 opendir 函数打开一个目录句柄 则该函数返回一个目录流 否则返回 false 来看个 opendir 列出目录下所有文件实例 代码如下 dirs 指定当前上当 if is dir dirs hanld opendir dirs while file re

    2026年3月19日
    1
  • Conda 创建和删除虚拟环境

    Conda 创建和删除虚拟环境conda 可以理解为一个工具 也是一个可执行命令 其核心功能是包管理和环境管理 包管理与 pip 的使用方法类似 环境管理则是允许用户方便滴安装不同版本的 python 环境并在不同环境之间快速地切换 conda 的设计理念 conda 将几乎所有的工具 第三方包都当作 package 进行管理 甚至包括 python 和 conda 自身 Anaconda 是一个打包的集合 里面预装好了 conda 某个版本的 python 各种 packages 等 1 安装 Anaconda 打开命令行输入 conda V 检验是否安装及当前 co

    2026年3月17日
    3
  • java sql 通配符_sql 通配符 转义符

    java sql 通配符_sql 通配符 转义符一 搜索通配符字符的说明可以搜索通配符字符 有两种方法可指定平常用作通配符的字符 使用 ESCAPE 关键字定义转义符 在模式中 当转义符置于通配符之前时 该通配符就解释为普通字符 例如 要搜索在任意位置包含字符串 5 的字符串 请使用 WHEREColumnA 5 ESCAPE 在上述 LIKE 子句中 前导和结尾百分号 解释为通配符 而斜杠

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号