最常用的 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 函数(项目中实用笔记)相关推荐

  1. java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作

    写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...

  2. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  3. java中主函数_(基础)java中的主函数

    Java中的主函数 1.由JVM调用:JVM通过类名直接调用主函数(静态方法) 2.主函数的形参是一个字符串数组: String[] args 3.运行主函数时,如果没有向其传递参数,JVM会自动创建 ...

  4. java反射回调函数_用J2V8注册Java回调函数

    J2V8是一套针对谷歌的V8 JavaScript引擎的Java绑定.J2V8的开发为Android平台带来了高效的Javascript的执行环境,taris.js 就是基于J2V8开发的.J2V8同 ...

  5. java 嵌入式 类型工具库_你常用的Java工具库都有哪些?

    Java命令行选项解析之Commons-CLI & Args4J & JCommander详细内容 Java调用Native API之JNA详细内容 Java执行SSH/SCP之JSc ...

  6. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  7. java基础巩固_(一)Java基础巩固

    Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发: JAVASE:Java Platform  ...

  8. java笔试题_一道简单的 Java 笔试题,但值得很多人反思

    专注于Java领域优质技术,欢迎关注 作者:匿蟒 前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问 ...

  9. java 下载加速_一种基于Java的大文件下载加速方法与流程

    本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...

最新文章

  1. 3D滚动下拉菜单-简直不要太任性
  2. .NET Core 2.0终于发布了
  3. 低质量的勤奋,比懒惰更可怕
  4. [Head First设计模式]生活中学设计模式——迭代器模式
  5. swfupload 进度条 提示 中文乱码
  6. mysql innodb 并发插入问题_包大量死锁错误_mysql innodb 并发插入问题,包大量死锁错误...
  7. webpack轻松入门教程
  8. JavaScript:年月日時分秒設置
  9. macOS设备上的照片导入Bridge
  10. 汉诺塔c++_C语言,递归解决汉诺塔问题
  11. 使用SVN将项目从服务器下载至本地
  12. 2021年春季 PAT乙级(复盘)
  13. ROS 交叉编译介绍
  14. Python基于PyTorch实现BP神经网络ANN回归模型项目实战
  15. Java的支持率让小伙伴们都惊呆了
  16. html添加用户与删除吗,HTML页面元素的添加与删除
  17. 年月日软件测试用例的设计,实验三日期题白盒测试用例设计.doc
  18. Acme的cmd line模式
  19. 大数据时代如何保障数据安全
  20. 用grads读取txt中经纬度画站点图

热门文章

  1. 系统调用004 SSDT
  2. 6、处理大数据对象(CLOB 数据小说+BLOG 数据图片,电影,音乐)
  3. 4、大数字运算(BigInteger类和BigDecimal类)
  4. 152. 城市游戏【单调栈】
  5. 102. 最佳牛围栏【二分 / 思维 不错】
  6. 2021算法竞赛入门班第八节课【数学】习题
  7. MySQL表的创建、删除、修改、复制(精品 必看)
  8. mysql 分词搜索_MySQL5.7分词全文检索思路
  9. linux之cal命令详解,linux命令大全之cal命令详解(显示日历)
  10. IDEA 15款神级良心插件强烈推荐收藏,提高一倍工作效率!