Java8 Stream流根据多个字段去重

目录
  • Stream流根据多个字段去重
  • Stream多字段去重,去重求和
    • 完整demo如下
    • 启动主函数

Stream流根据多个字段去重

分组

list.stream().collect(Collectors.groupingBy(ClassEntity::getGrade));

java8有一个collectingAndThen可以根据多个字段去重

list.stream()
.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getProfessionId() + ";" + o.getGrade()))), ArrayList::new));

通过hashSet去重:

该种去重是bean完全相同的时候算重复数据

List<String> classNameList = new ArrayList(new HashSet(list));

Stream多字段去重,去重求和

stream进行list的循环遍历。

conver的String由去重条件组成,中间用下划线或特殊字符分割

代码如下:

完整demo如下

附带测试结果

class User {
    private int id;
    private String name;
    private Integer record;
    public User() {
    }

    public User(int id,String name, Integer record) {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Integer getRecord() {
        return record;
    }

    public void setRecord(Integer record) {
        this.record = record;
    }

}

启动主函数

public class Main {
    public static void main(String[] args) {
    List<User> users = new ArrayList<>();
    User user1 = new User();
        user1.setId(1);
        user1.setName("小明");
        user1.setRecord(50);
        users.add(user1);
    User user2 = new User();
        user2.setId(1);
        user2.setName("小明");
        user2.setRecord(60);
        users.add(user2);
    User user3 = new User();
        user3.setId(2);
        user3.setName("小华");
        user3.setRecord(70);
        users.add(user3);
    User user4 = new User();
        user4.setId(2);
        user4.setName("小华");
        user4.setRecord(80);
        users.add(user4);
    User user5 = new User();
        user5.setId(3);
        user5.setName("小芳");
        user5.setRecord(100);
        users.add(user5);

        Map<String, Integer> conver = new HashMap();
        users.stream().forEach(x -> {
            String cKey = x.getId()+"_"+x.getName();
            if (!conver.containsKey(cKey)) {
                conver.put(cKey, x.getRecord());
            } else {
                Integer temp = conver.get(cKey);
                conver.put(cKey, (null == temp ? 0 : temp) + (null == x.getRecord() ? 0 : x.getRecord()));
            }
        });
        System.out.println(conver.size());
        for(Map.Entry<String, Integer> entry:conver.entrySet()){
            System.out.println("key:"+entry.getKey()+","+"value:"+entry.getValue());
        }
    }
}

运行结果如下:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java8使用stream实现list中对象属性的合并(去重并求和)

    前言 需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为BillsNums,有id.nums.sums三个属性,其中id表示唯一值,需要nums与sums进行求和,并最后保持一份. 例如说:("s1", 1, 1),("s1",2,3),("s2",4,4), 求和并去重的话,就是("s1", 3, 4),("s2",4,4) 对象与属性 class BillsNums { private

  • Java8利用Stream实现列表去重的方法详解

    目录 一. Stream 的distinct()方法 1.1 对于 String 列表的去重 1.2 对于实体类列表的去重 二. 根据 List<Object> 中 Object 某个属性去重 2.1 新建一个列表出来 2.2 通过 filter() 方法 一. Stream 的distinct()方法 distinct()是Java 8 中 Stream 提供的方法,返回的是由该流中不同元素组成的流.distinct()使用 hashCode() 和 eqauls() 方法来获取不同的元素.

  • Java 8 Stream.distinct() 列表去重的操作

    在这篇文章里,我们将提供Java8 Stream distinct()示例. distinct()返回由该流的不同元素组成的流.distinct()是Stream接口的方法. distinct()使用hashCode()和equals()方法来获取不同的元素.因此,我们的类必须实现hashCode()和equals()方法. 如果distinct()正在处理有序流,那么对于重复元素,将保留以遭遇顺序首先出现的元素,并且以这种方式选择不同元素是稳定的. 在无序流的情况下,不同元素的选择不一定是稳定

  • Java8 Stream流根据多个字段去重

    目录 Stream流根据多个字段去重 Stream多字段去重,去重求和 完整demo如下 启动主函数 Stream流根据多个字段去重 分组 list.stream().collect(Collectors.groupingBy(ClassEntity::getGrade)); java8有一个collectingAndThen可以根据多个字段去重 list.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection

  • Java8 stream流的map()方法你会使用了吗

    目录 一.前言 二.概述 三.详述 3.1.找出所有的学生姓名 3.2.将姓名为“赵三”的语文成绩置为90 3.3.找出一年级学生的成绩 四.总结 一.前言 在日常的开发工作中经常碰到要处理list中数据的问题,比如从数据库中查出了很多学生,由于一些原因需要在内存中找出这些学生中的所有姓名,或者把名为“王五”的语文成绩暂时修改为“100”,这些问题怎么处理呐,之前我们想到的是遍历每个元素,然后取出来放到另外一个集合中,在java8中对集合可以进行流式操作使上面的处理更简洁.今天来看下map()方

  • java8 Stream流逐行处理文本文件

    本文中为大家介绍使用java8 Stream API逐行读取文件,以及根据某些条件过滤文件内容 1. Java 8逐行读取文件 在此示例中,我将按行读取文件内容并在控制台打印输出. Path filePath = Paths.get("c:/temp", "data.txt"); //try-with-resources语法,不用手动的编码关闭流 try (Stream<String> lines = Files.lines( filePath )) {

  • Java8 Stream 流常用方法合集

    目录 一.概述 二.分类 三.具体用法 1. 流的常用创建方法 2. 流的中间操作 3. 流的终止操作 一.概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询.也可以使用 Stream API 来并行执行操作. 简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式. 特点: 不是数据结构,不会保存数据.

  • Java8 Stream流的常用方法汇总

    目录 1.快速创建List (1).new一个list,一个一个添加 (2).Stream流:创建动态list,可以添加元素 (3).如果创建一个固定长度的list,可以使用Arrays.asList(…args)直接返回一个list 2.取对象的某一列: (1).遍历 (2).Stream流:map 3.过滤,或者说是根据一个判断条件筛选出目标对象 (1).遍历加 if (2).Stream流:filter 4.分组 (1).遍历加 if (2).Stream流:groupingBy 5.求和

  • 使用Java8 Stream流的skip + limit实现批处理的方法

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (

  • Java8 Stream流多字段求和、汇聚的实例

    目录 Stream流多字段求和.汇聚 实现方法 对象类型数据处理 Map类型数据处理 Stream分组求和使用笔记 分组求和使用 Stream流多字段求和.汇聚 实现方法 利用 Collectors.toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) keyMapper:代表你最终想要获得的Map<Key, Value> 的Key valueMapper:代表你最终想要获得的Map<K

  • 如何实现java8 list按照元素的某个字段去重

    list 按照元素的某个字段去重 @Data @AllArgsConstructor @NoArgsConstructor public class Student { private Integer age; private String name; } 测试数据 List<Student> studentList = Lists.newArrayList(); studentList.add(new Student(28, "river")); studentList.

  • java8 stream 操作map根据key或者value排序的实现

    引言 最近小编自己一个人在负责一个项目的后台开发,其中有一部分是统计相关的功能,所以需要一些排序或者分组的操作,之前这种操作小编觉得还是比较麻烦的,虽热有一些现成的工具类,但是工具类的写法也是比较复杂的,但是如果使用java8 stream流的话就比较简单了,并且代码量会大大的减少,下面总结几个对map的操作. 1.map 根据value排序 Map<String,BigDecimal> map =new HashMap<>(); map.put("one",

  • JDK1.8新特性Stream流式操作的具体使用

    一. 前言 随着Java的发展,越来越多的企业开始使用JDK1.8 版本.JDK1.8 是自 JDK1.5之后最重要的版本,这个版本包含语言.编译器.库.工具.JVM等方面的十多个新特性.本次文章将着重学习Stream. Stream 是JDK1.8 中处理集合的关键抽象概念,Lambda 和 Stream 是JDK1.8新增的函数式编程最有亮点的特性了,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用SQ

随机推荐