java lambda函数_最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)
最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)
简介
Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版本也都面向商业收费了,很多新手,我所接触到的,像我那时候一样,追求船新版本,一上来就去学java14的东西,当成一个爱好还行,重心还是要放在实用上
过滤
需求:我需要过滤高考分数大于500的人
首先,新建一个内部类
static class Student{
private String name;
private Integer score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name!=null ? name.trim() : null;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
public Student(String name, Integer score) {
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
"}\n";
}
}
使用IntStream遍历快速初始化一批值
public static void main(String[] args) {
List studentList = IntStream.rangeClosed(0,20)
.mapToObj(i -> new Student("Java Pro"+i,490+i))
.collect(Collectors.toList());
}
过滤出分数大于500的并输出
List studentGiao = studentList.stream()
.filter(student -> student.score > 500)
.collect(Collectors.toList());
System.out.println(studentGiao.toString());
输出:
[Student{name='Java Pro11', score=501}
, Student{name='Java Pro12', score=502}
, Student{name='Java Pro13', score=503}
, Student{name='Java Pro14', score=504}
, Student{name='Java Pro15', score=505}
, Student{name='Java Pro16', score=506}
, Student{name='Java Pro17', score=507}
, Student{name='Java Pro18', score=508}
, Student{name='Java Pro19', score=509}
, Student{name='Java Pro20', score=510}
]
日常求和
需要考虑到为空和为0的情况
package com.github.gleans;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
public class LambdaLearning {
public static void main(String[] args) {
List nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
double resNum = nums.stream()
.map(num -> Objects.isNull(num) ? 0 : num)
.mapToDouble(num -> num)
.sum();
System.out.println(resNum);
}
}
map是重新指向一个对象,把->右侧的对象赋予,此处判断若num为null则赋予0值
注意,这里不可给null使用filter过滤掉,否则全为null的情况,会报空指针异常
扩展计算
public static void testTwo(){
List nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
DoubleSummaryStatistics number = nums.stream()
.map(num -> Objects.isNull(num) ? 0 : num)
.mapToDouble(num -> num)
.summaryStatistics();
System.out.println("最大值:"+number.getMax());
System.out.println("最小值:"+number.getMin());
System.out.println("平均值:"+number.getAverage());
}
输出
最大值:5.6
最小值:0.0
平均值:2.6953333333333336
reduce简单使用
public static void main(String[] args) {
testOne();
}
public static void testOne(){
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
// 这里的 10 相当于初始值
int sum = numbers
.stream()
.reduce(10, Integer::sum);
System.out.println(sum);
}
Collectors.groupingBy
根据年龄分组
package com.github.gleans;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class SumWage {
public static void main(String[] args) {
List userDemoList = new ArrayList() {{
add(new UserDemo(20, "jason", BigDecimal.valueOf(1000000)));
add(new UserDemo(22, "yasuo", BigDecimal.valueOf(2000000)));
add(new UserDemo(22, "ekko", BigDecimal.valueOf(100)));
}};
Map> UserDemoMapByAge = userDemoList.stream()
.collect(Collectors.groupingBy(UserDemo::getAge));
System.out.println(UserDemoMapByAge.toString());
}
static class UserDemo {
private int age;
private String username;
private BigDecimal wage;
public UserDemo(int age, String username, BigDecimal wage) {
this.age = age;
this.username = username;
this.wage = wage;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public BigDecimal getWage() {
return wage;
}
public void setWage(BigDecimal wage) {
this.wage = wage;
}
@Override
public String toString() {
return "UserDemo{" +
"age=" + age +
", username='" + username + '\'' +
", wage=" + wage +
'}';
}
}
}
输出
{20=[UserDemo{age=20, username='jason', wage=1000000}], 22=[UserDemo{age=22, username='yasuo', wage=2000000}, UserDemo{age=22, username='ekko', wage=100}]}
json化观看观看更为直观
{
20:[
{
"age":20,
"username":"jason",
"wage":1000000
}
],
22:[
{
"age":22,
"username":"yasuo",
"wage":2000000
},
{
"age":22,
"username":"ekko",
"wage":100
}
]
}
进阶计算 Collectors.summarizingDouble
Map userAvgWageByAge = userDemoList.stream()
.collect(Collectors.groupingBy(UserDemo::getAge, Collectors.summarizingDouble(s -> s.getWage().doubleValue())));
userAvgWageByAge.forEach((k, v) -> System.out.println(String.format("年龄:%d,平均工资:%f", k, v.getAverage())));
数组快速转为List
Stream.of(1, 2, 3, 4).collect(Collectors.toList())
结论
后续会学习更多关于Lambda的操作,日积月累...一定会成为一个秃头的程序猿
java lambda函数_最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)相关推荐
- java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作
写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...
- ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密
**PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...
- java中主函数_(基础)java中的主函数
Java中的主函数 1.由JVM调用:JVM通过类名直接调用主函数(静态方法) 2.主函数的形参是一个字符串数组: String[] args 3.运行主函数时,如果没有向其传递参数,JVM会自动创建 ...
- java反射回调函数_用J2V8注册Java回调函数
J2V8是一套针对谷歌的V8 JavaScript引擎的Java绑定.J2V8的开发为Android平台带来了高效的Javascript的执行环境,taris.js 就是基于J2V8开发的.J2V8同 ...
- java 嵌入式 类型工具库_你常用的Java工具库都有哪些?
Java命令行选项解析之Commons-CLI & Args4J & JCommander详细内容 Java调用Native API之JNA详细内容 Java执行SSH/SCP之JSc ...
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- java基础巩固_(一)Java基础巩固
Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发: JAVASE:Java Platform ...
- java笔试题_一道简单的 Java 笔试题,但值得很多人反思
专注于Java领域优质技术,欢迎关注 作者:匿蟒 前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问 ...
- java 下载加速_一种基于Java的大文件下载加速方法与流程
本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...
最新文章
- 3D滚动下拉菜单-简直不要太任性
- .NET Core 2.0终于发布了
- 低质量的勤奋,比懒惰更可怕
- [Head First设计模式]生活中学设计模式——迭代器模式
- swfupload 进度条 提示 中文乱码
- mysql innodb 并发插入问题_包大量死锁错误_mysql innodb 并发插入问题,包大量死锁错误...
- webpack轻松入门教程
- JavaScript:年月日時分秒設置
- macOS设备上的照片导入Bridge
- 汉诺塔c++_C语言,递归解决汉诺塔问题
- 使用SVN将项目从服务器下载至本地
- 2021年春季 PAT乙级(复盘)
- ROS 交叉编译介绍
- Python基于PyTorch实现BP神经网络ANN回归模型项目实战
- Java的支持率让小伙伴们都惊呆了
- html添加用户与删除吗,HTML页面元素的添加与删除
- 年月日软件测试用例的设计,实验三日期题白盒测试用例设计.doc
- Acme的cmd line模式
- 大数据时代如何保障数据安全
- 用grads读取txt中经纬度画站点图
热门文章
- 系统调用004 SSDT
- 6、处理大数据对象(CLOB 数据小说+BLOG 数据图片,电影,音乐)
- 4、大数字运算(BigInteger类和BigDecimal类)
- 152. 城市游戏【单调栈】
- 102. 最佳牛围栏【二分 / 思维 不错】
- 2021算法竞赛入门班第八节课【数学】习题
- MySQL表的创建、删除、修改、复制(精品 必看)
- mysql 分词搜索_MySQL5.7分词全文检索思路
- linux之cal命令详解,linux命令大全之cal命令详解(显示日历)
- IDEA 15款神级良心插件强烈推荐收藏,提高一倍工作效率!