Java中的TreeSet集合解析

记一下java流处理的操作

1.去重,按照billTypeCode去重

list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getBillTypeCode()))), ArrayList::new));
排序:
List<DictValue> sortedDictValues = dictValues.stream().sorted(Comparator.comparingInt(DictValue::getOrderNum)).collect(Collectors.toList());

2.求和

Double sum = workDoc.getItemList().stream().mapToDouble(e -> e.getAllocatedQuantity().doubleValue()).reduce(0, Double::sum);
Integer ageSum = persons .stream() .reduce(0, (sum, p) -> sum += p.age, (sum1, sum2) -> sum1 + sum2);

3.遍历赋值

list.stream().forEach(e -> e.setStatus("30"));

4.过滤

List<ItemInfo> itemone = new ArrayList<>(itemInfos);
itemone = itemone.stream().filter(o -> matnr.equals(o.getItemCode())).collect(Collectors.toList());

5.map: stream().map()可以让你转化一个对象成其他的对象

List<String> lineList = itemCodeNoExistList.stream().map(ShopOrderExcelDto::getLine).collect(Collectors.toList());

6.把list转化为map,key是id,value是实体,如果存在重复的key,取第一个实体

Map<Integer, Person> mapp = list.stream().collect(Collectors.toMap(Person::getId, Function.identity(),(k1, k2) -> k1));

7.取值去重

List<String> targetFactoryCode = targetLocationList.stream().map(Location::getFactoryCode).distinct().collect(Collectors.toList());

8.分组,对于list中的对象按照名字分组,返回一个map<String,List>

Map<String,List<Person>> m = list.stream().collect(Collectors.groupingBy(l->l.getName()));

9.分组,返回一个Map<Boolean,List>,如果分组了,就是list的size>1,则是true,否则是false

Map<Boolean,List<Person>> m = list.stream().collect(Collectors.groupingBy(p->p.getName().equals("haha")));

10.groupingBy()提供第二个参数,表示downstream,即对分组后的value作进一步的处理,返回map<String,Set>

Map<String,Set<Person>> m = list.stream().collect(Collectors.groupingBy(l->l.getName(),Collectors.toSet()));

11.分组,返回value集合中元素的数量

Map<String,Long> m = list.stream().collect(Collectors.groupingBy(l->l.getName(),Collectors.counting()));

12.分组,对value集合中元素求和

Map<String,Integer> m = list.stream().collect(Collectors.groupingBy(l->l.getName(),Collectors.summingInt(Person::getId)));

13.分组,并取value集合中某个元素最大的实体,在这里先按照name分组,然后取id最大的的实体,注意value是Optional的

Map<String,Optional<Person>> m = list.stream().collect(Collectors.groupingBy(l->l.getName(),Collectors.maxBy(Comparator.comparing(Person::getId))));

14.分组,并通过mapping对value字段进行处理

Map<String,Set<Integer>> m = list.stream().collect(Collectors.groupingBy(l->l.getName(),Collectors.mapping(Person::getId,Collectors.toSet())));

 15.对于list集合的空指针问题java8的处理方式:如果list不为空,那就赋值给newList,否则重新new一个list

public static void main(String[] args) {
List<String> list = null;
List<String> newList = Optional.ofNullable(list).orElse(Lists.newArrayList());
newList.forEach(x -> System.out.println(x));
}

 16.循环

IntStream.range(1, 4) .forEach(System.out::println); // 相当于 for (int i = 1; i < 4; i++) {} // 1 // 2 // 3

17.原始类型聚合操作

Arrays.stream(new int[] {1, 2, 3})

.map(n -> 2 * n + 1) // 对数值中的每个对象执行 2*n + 1 操作

.average() // 求平均值

.ifPresent(System.out::println); // 如果值不为空,则输出 // 5.0

18.常规对象转为原始类型

Stream.of("a1", "a2", "a3") .map(s -> s.substring(1)) // 对每个字符串元素从下标1位置开始截取

.mapToInt(Integer::parseInt) // 转成 int 基础类型类型流

.max() // 取最大值

.ifPresent(System.out::println); // 不为空则输出 // 3

19.原始类型转化为对象

IntStream.range(1, 4) .mapToObj(i -> "a" + i) // for 循环 1->4, 拼接前缀

a .forEach(System.out::println); // for 循环打印

20.元素连接

String phrase = persons .stream() .filter(p -> p.age >= 18) // 过滤出年龄大于等于18的

.map(p -> p.name) // 提取名字

.collect(Collectors.joining(" and ", "In Germany ", " are of legal age.")); // 以 In Germany 开头,and 连接各元素,再以 are of legal age. 结束

System.out.println(phrase); // In Germany Max and Peter and Pamela are of legal age.

21.流转化为map

Map<Integer, String> map = persons .stream()

.collect(Collectors.toMap( p -> p.age, p -> p.name, (name1, name2) -> name1 + ";" + name2)); // 对于同样 key 的,将值拼接 System.out.println(map);

// {18=Max, 23=Peter;Pamela, 12=David}

22.自定义收集器,不使用内置收集器Collectors

Collector<Person, StringJoiner, String> personNameCollector = Collector.of(

() -> new StringJoiner(" | "), // supplier 供应器

(j, p) -> j.add(p.name.toUpperCase()), // accumulator 累加器

(j1, j2) -> j1.merge(j2), // combiner 组合器

StringJoiner::toString); // finisher 终止器

String names = persons .stream() .collect(personNameCollector); // 传入自定义的收集器

System.out.println(names); // MAX | PETER | PAMELA | DAVID

归约

23.找出年龄最大的人

persons .stream() .reduce((p1, p2) -> p1.age > p2.age ? p1 : p2) .ifPresent(System.out::println); // Pamela

24.第二种reduce方法接受标识值和BinaryOperator累加器。此方法可用于构造一个新的 Person,其中包含来自流中所有其他人的聚合名称和年龄:

Person result = persons .stream()

.reduce(new Person("", 0), (p1, p2) -> { p1.age += p2.age; p1.name += p2.name; return p1; });

System.out.format("name=%s; age=%s", result.name, result.age);

// name=MaxPeterPamelaDavid; age=76

25.第三种reduce方法接受三个参数:标识值,BiFunction累加器和类型的组合器函数BinaryOperator。由于初始值的类型不一定为Person,我们可以使用这个归约函数来计算所有人的年龄总和:

Integer ageSum = persons .stream() .reduce(0, (sum, p) -> sum += p.age, (sum1, sum2) -> sum1 + sum2);

System.out.println(ageSum); // 76

26.集合操作

CollectionUtils.subList:截取list

---------------------------------111------------------------------------------------------------------------------------

java中的treeset函数可以用于对集合进行排序。与其他集合不同,treeset会按照元素的自然排序对其进行排序。下面将详细介绍如何使用treeset函数对集合进行排序。

  1. TreeSet介绍

TreeSet是一种基于红黑树实现的有序集合。TreeSet继承自AbstractSet类,并实现了NavigableSet接口。TreeSet通过实现元素的自然排序或按传入的Comparator对象进行排序。

对于TreeSet,最重要的方法是add()、remove()、contains()等方法,这些方法通过调用AbstractSet类中的方法实现。此外,TreeSet还实现了几个有序集合方法如first()、last()、headSet()、tailSet()和subSet()等。

  1. 使用TreeSet进行集合排序

下面将使用一个例子来介绍如何使用TreeSet对集合进行排序。我们将使用一个Student类,并创建一个包含多个Student对象的集合来进行排序。

首先,我们需要定义Student类:

立即学习“Java免费学习笔记(深入)”;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

public class Student implements Comparable<student> {

    private String name;

    private int age;

    public Student(String name, int age) {

        this.name = name;

        this.age = age;

    }

    public String getName() {

        return name;

    }

    public int getAge() {

        return age;

    }

    @Override

    public int compareTo(Student student) {

        return this.age - student.age;

    }

    @Override

    public String toString() {

        return "Student{" +

                "name='" + name + ''' +

                ", age=" + age +

                '}';

    }

}</student>

上面的代码中,我们定义了一个Student类,并实现了Comparable接口。我们通过实现compareTo()方法来定义元素的自然排序方法。

在比较两个Student对象时,我们比较它们的年龄,因为我们希望按照年龄对学生进行排序。

接下来,我们创建一个包含多个Student对象的集合:

1

2

3

4

5

Set<student> students = new TreeSet();

students.add(new Student("张三", 20));

students.add(new Student("李四", 19));

students.add(new Student("王五", 22));

students.add(new Student("赵六", 21));</student>

我们可以看到,我们向集合添加了四个Student对象。我们并没有使用Collections.sort()方法来对集合进行排序,而是使用了TreeSet函数,它会自动按照元素的自然排序进行排序。

最后,我们可以使用for-each循环来遍历集合,并输出学生的信息:

1

2

3

for (Student student : students) {

    System.out.println(student);

}

最终的输出结果会按照学生的年龄从小到大进行排序:

1

2

3

4

Student{name='李四', age=19}

Student{name='张三', age=20}

Student{name='赵六', age=21}

Student{name='王五', age=22}

  1. 自定义排序方法

如果我们不想按照元素的自然排序进行排序,我们可以使用Comparator对象来自定义排序方法。下面的代码演示了如何使用Comparator对象来自定义排序方法:

1

2

3

4

5

Set<student> students = new TreeSet(Comparator.comparing(Student::getName));

students.add(new Student("张三", 20));

students.add(new Student("李四", 19));

students.add(new Student("王五", 22));

students.add(new Student("赵六", 21));</student>

上面的代码中,我们在创建TreeSet对象时传入了一个Comparator对象。我们通过调用Comparator.comparing()方法,并使用Student类中的getName()方法来定义排序方法。这意味着我们将按照学生的姓名进行排序。

最后,我们仍然使用for-each循环来遍历集合,并输出学生的信息:

1

2

3

for (Student student : students) {

    System.out.println(student);

}

最终的输出结果将按照学生的姓名从小到大进行排序:

1

2

3

4

Student{name='李四', age=19}

Student{name='张三', age=20}

Student{name='赵六', age=21}

Student{name='王五', age=22}

  1. 总结

使用TreeSet函数对集合进行排序比其他方法更为简便。它会自动按照元素的自然排序进行排序,也可以通过传入Comparator对象来自定义排序方法。通过掌握TreeSet的使用方法,我们可以更轻松地对Java中的集合进行排序。

--------------------------------------------2222222222222----------------------------

Java中的TreeSet集合解析_java_脚本之家

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476293.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中mixin(混入)的使用

目录 mixin(混入) 使用方式 第一步定义混合 ​编辑 第二步使用混入 局部混入 全局混合 mixin(混入) 功能&#xff1a;可以把多个组件共用的配置提取成一个混入对象 使用方式 第一步定义混合 { data(){....}, methods:{....} .... } 第二步使用混入 …

vue中路由缓存

vue中路由缓存 问题描述及截图解决思路关键代码及打印信息截图 问题描述及截图 在使用某一平台时发现当列表页码切换后点击某一卡片进入详情页后&#xff0c;再返回列表页时页面刷新了。这样用户每次看完详情回到列表页都得再重新输入自己的查询条件&#xff0c;或者切换分页到…

Easyexcel(1-注解使用)

相关文章链接&#xff1a; Easyexcel&#xff08;1-注解使用&#xff09; 版本依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.3</version> </dependency>ExcelProperty…

Vue3 -- mock数据完整配置并调试【项目集成6】

引言&#xff1a; ‌Mock在前端开发中的作用主要是模拟后端接口数据&#xff0c;以便前端开发者能够提前进行页面和功能的开发、调试&#xff0c;而无需等待后端提供真实的接口数据‌。Mock数据可以加速前后端开发的协同&#xff0c;避免因数据延迟导致的开发阻塞‌。【摘自百…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

数据结构(顺序栈——c语言实现)

栈的基本概念&#xff1a; 栈是限制在一端进行插入操作和删除操作的线性表&#xff08;俗称堆栈&#xff09;&#xff0c;允许进行操作的一端称为“栈顶”&#xff0c;另一固定端称为“栈底”&#xff0c;当栈中没有元素时称为“空栈” 特点&#xff1a;先进后出&#xff08;FI…

【智谱清言-注册_登录安全分析报告】

前言 由于网站注册入口容易被机器执行自动化程序攻击&#xff0c;存在如下风险&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露&#xff0c;不符合国家等级保护的要求。短信盗刷带来的拒绝服务风险 &#xff0c;造成用户无法登陆、注册&#xff0c;大量收到垃圾短信的…

[Realtek sdk-3.4.14b] RTL8197FH-VG新增jffs2分区操作说明

sdk说明 ** Gateway/AP firmware v3.4.14b – Aug 26, 2019**  Wireless LAN driver changes as:  Refine WiFi Stability and Performance  Add 8812F MU-MIMO  Add 97G/8812F multiple mac-clone  Add 97G 2T3R antenna diversity  Fix 97G/8812F/8814B MP issu…

Cesium 加载B3DM模型

一、引入Cesium&#xff0c;可以使用该链接下载cesium 链接: https://pan.baidu.com/s/1BRQyaFCkxO2xQQT5RzFUCw?pwdkcv9 提取码: kcv9 在index.html文件中引入cesium <script type"text/javascript" src"/Cesium/Cesium.js"></script> …

掌握移动端性能测试利器:深入JMeter手机录制功能

引言 在当今移动互联网时代&#xff0c;应用程序的性能和用户体验至关重要。为了确保应用程序在不同设备和网络环境下都能稳定运行&#xff0c;性能测试成为了不可或缺的一环。Apache JMeter作为一款强大的开源性能测试工具&#xff0c;不仅支持传统的PC端性能测试&#xff0c…

友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!

2024年11月19日&#xff0c;第十三届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2024年广州科技创新创业大赛智能装备行业赛颁奖典礼隆重举行。 赛事奖项介绍&#xff1a;广州科技创新创业大赛智能装备行业赛 第十三届“中国创新创业大赛&#xff08;广东广州赛区…

Docker3:docker基础1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

MySQL - 数据库基础 | 数据库操作 | 表操作

文章目录 1、数据库基础1.1为什么要有数据库1.2主流的数据库1.3连接MySQL1.4服务器、数据库、表的关系1.5 MySQL框架1.6 SQL分类1.7储存引擎 2.数据库操作2.1创建数据库2.2字符集和校验规则2.3删除数据库2.4修改数据库2.5备份与恢复2.6查看连接情况 3.表的操作3.1创建表3.2查看…

通过vite+vue3+pinia从0到1搭建一个uniapp应用

最近项目上要做一个app&#xff0c;选择了用uniapp作为开发框架&#xff1b;我大概看了一下uniapp的文档&#xff0c;根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器&#xff0c;但是uniapp官方推荐使用HBuilder搭建&#xff0c;如果和我一样…

学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode

windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置&#xff0c;但是在phpstudy中打开mysql配置文件my.ini后&#xff0c; 通过查找找不到sql_mode或sql-mode&#xff0c; 此时无法在my.ini文件中直接进行修改&#xff0c;可以使用mysql命令进行修改&#…

IDEA:2023版远程服务器debug

很简单&#xff0c;但是很多文档没有写清楚&#xff0c;wocao 一、首先新建一个远程jvm 二、配置 三、把上面的参数复制出来 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 四、然后把这串代码放到服务器中&#xff08;这里的0.0.0.0意思是所有IP都能访问&a…

ts: 定义一个对象接收后端返回对象数据,但是报错了有红色的红线为什么

问&#xff1a; const backendProgressData ref<object>&#xff08;{}&#xff09; 这是我的代码&#xff0c;但是当我进行使用的时候&#xff1a; backendProgressData.value xxxx接口返回数据progressData:{percentage:123,text:"文字"} 在template中{{…

解决Docker环境变量的配置的通用方法

我们部署的很多服务都是以Docker容器的形式存在的。 在运行Docker容器前&#xff0c;除了设置网络、数据卷之外&#xff0c;还需要设置各种各样的环境变量。 有时候&#xff0c;由于容器版本的问题&#xff0c;一些文档没有及时更新&#xff0c;可能同时存在多个新旧版本的环…

【腾讯云产品最佳实践】腾讯云CVM入门技术与实践:通过腾讯云快速构建云上应用

目录 前言 什么是腾讯云CVM&#xff1f; 腾讯云CVM的技术优势 基于最佳技术实践&#xff0c;使用腾讯云CVM搭建应用 1. 开通CVM实例 2. 连接CVM实例 3. 配置Web环境 4. 部署PHP应用 腾讯云CVM行业应用案例&#xff1a;电商平台的双十一攻略 1. 弹性伸缩解决高并发问题…

51c嵌入式~IO合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11697814 一、STM32串口通信基本原理 通信接口背景知识 设备之间通信的方式 一般情况下&#xff0c;设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。 串行通信的分类 1、按照数据传…