IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> java lambda 有效实例(结合List,Map数据结构) -> 正文阅读

[数据结构与算法]java lambda 有效实例(结合List,Map数据结构)

1. 编写目的

总结一下这么长时间使用 java 的 lambda 表达式的方法,也方便以后使用。

2. map 操作

map 应该理解为建立一个映射关系,将已有的数据映射到另外一种格式或者放入某个函数中得到新的数值。

2.1 map 基础操作(结合list)

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5, 42, 99, 323);

// 1. 将每个数值进行平方,并转换回 list
List<Double> result1 = numbers.stream().map(e -> Math.pow(e, 2)).collect(Collectors.toList());
result1.forEach(System.out::println);

// 2. 转换为 double 类型
List<Double> result2 = numbers.stream().map(e -> e * 1.0).collect(Collectors.toList());
result2.forEach(System.out::println);

// 等同于 map(e->Double.valueOf(e))
List<Double> result3 = numbers.stream().map(Double::valueOf).collect(Collectors.toList());
result3.forEach(System.out::println);

// 转换为字符串
List<String> result4 = numbers.stream().map(e -> e + "").collect(Collectors.toList());
result4.forEach(System.out::println);

// 3. 结合 mapTo 来求和
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);

// 4. 获取对应的平方数
List<Integer> result5 = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList());
result5.forEach(System.out::println);

2.2 map 用于“解包”

比如说我们拿到一个 List<Pair<String, Double>> 类型的学生成绩类型的数据,需要从中提取出所有 Double 类型的数据,组成新的 List。

// 制造假数据
LinkedList<Pair<String, Double>> students = new LinkedList<>();
students.add(new Pair<>("xiaoming", 98.5));
students.add(new Pair<>("xiaofang", 98.8));
students.add(new Pair<>("xiaoli", 68.8));
students.add(new Pair<>("xiaogabg", 48.8));
students.add(new Pair<>("xiaohe", 73.4));

// 1. 拿到所有人的姓名
List<String> names = students.stream().map(e -> e.getKey()).collect(Collectors.toList());
names.forEach(System.out::println);

// 打印
// xiaoming
// xiaofang
// xiaoli
// xiaogabg
// xiaohe
// 2. 拿到所有人的分数
List<Double> scores = students.stream().map(Pair::getValue).collect(Collectors.toList());
scores.forEach(System.out::println);
// 98.5
// 98.8
// 68.8
// 48.8
// 73.4

这个例子比较简单,当遇到复杂的数据的时候可以多层 map,一层一层的解开。

3. filter 操作

过滤功能,需要注意的是 返回的是符合条件的

// 制造假数据
LinkedList<Pair<String, Double>> students = new LinkedList<>();
students.add(new Pair<>("xiaoming", 98.5));
students.add(new Pair<>("xiaofang", 98.8));
students.add(new Pair<>("xiaoli", 68.8));
students.add(new Pair<>("xiaogabg", 48.8));
students.add(new Pair<>("xiaohe", 73.4));

// 1. 成绩超过 90 分的
List<Pair<String, Double>> some = students.stream().filter(e -> e.getValue() > 90).collect(Collectors.toList());
some.forEach(System.out::println);
// 打印内容
// xiaoming=98.5
// xiaofang=98.8

// 2. 成绩超过 90 的名字
List<String> some2 = students.stream().filter(e -> e.getValue() > 90).map(e -> e.getKey()).collect(Collectors.toList());
some2.forEach(System.out::println);
// 打印
// xiaoming
// xiaofang

4. Collectors 操作

前面一直在用 Collectors.toList 方法,还有其他用法主要如下。

4.1 toSet 去重

List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5, 42, 99, 323);

// toSet 去重
Set<Integer> result1 = numbers.stream().collect(Collectors.toSet());
result1.forEach(System.out::println);
// 2
// 3
// 99
// 323
// 5
// 7
// 42

4.2 toList

前面的例子一直在用这个方法,这里不介绍了。

4.3 groupBy 分组操作

// 制造假数据
LinkedList<Pair<String, Double>> students = new LinkedList<>();
students.add(new Pair<>("xiaoming", 98.5));
students.add(new Pair<>("xiaoming", 98.5));
students.add(new Pair<>("xiaoming", 98.5));
students.add(new Pair<>("xiaofang", 98.8));
students.add(new Pair<>("xiaoli", 68.8));
students.add(new Pair<>("xiaogabg", 48.8));
students.add(new Pair<>("xiaohe", 73.4));
students.add(new Pair<>("xiaohe", 73.4));
students.add(new Pair<>("xiaohe", 73.4));

Map<String, List<Pair<String, Double>>> group = students.stream().collect(Collectors.groupingBy(Pair::getKey));
group.entrySet().forEach(e->{
    System.out.print("分组:"+e.getKey()+":\t");
    System.out.print(e.getValue()+"\n");
});
//        分组:xiaogabg:	[xiaogabg=48.8]
//        分组:xiaoming:	[xiaoming=98.5, xiaoming=98.5, xiaoming=98.5]
//        分组:xiaohe:	[xiaohe=73.4, xiaohe=73.4, xiaohe=73.4]
//        分组:xiaoli:	[xiaoli=68.8]
//        分组:xiaofang:	[xiaofang=98.8]

5. 总结

只是对以前的比较进行补充,希望可以帮助到需要的小伙伴。致谢~

Smileyan
2022.6.21 19:57

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-29 19:19:22  更:2022-06-29 19:21:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年3日历 -2024/3/29 23:03:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码