java8函数式编程学习(二):optional,函数式接口和并行流的学习

简介

java8函数式编程中optional的简单使用,函数式接口的了解,并行流的使用。

optional

可以更优雅的来避免空指针异常。类似于包装类,把具体的数据封装到optional对象内部,然后使用optional的方法去操作封装好的数据。

创建optional对象

ofNullable方法

使用静态方法ofNullable把数据封装成optional对象,方法的参数可为空。
通常会用在方法上,把方法的返回值封装成optional对象返回。

public class OptionalTest01 {public static void main(String[] args) {Optional<Integer> num = getNum();num.ifPresent(num1-> System.out.println(num1));}public static Optional<Integer> getNum(){Integer a= 2;return Optional.ofNullable(a);}
}

当a=null时,则不会输出任何东西,但也不会报空指针异常。

扩展:

mybatis3.5以上是支持optional类型的,可以直接把dao层的返回值定义为optional,mybatis会自动的把数据封装成optional对象返回。

of方法

使用optional的静态方法of来封装optional对象,参数不能为null,否则会报空指针异常。

package com;import java.util.Optional;public class OptionalTest02 {public static void main(String[] args) {Optional<Integer> num = getNum();num.ifPresent(num1-> System.out.println(num1));}public static Optional<Integer> getNum(){Integer a= null;return Optional.of(a);}
}

在这里插入图片描述

empty方法

empty可以把null封装成optional对象,可以和of方法一起使用。

package com;import java.util.Optional;public class OptionalTest03 {public static void main(String[] args) {Optional<Integer> num = getNum();num.ifPresent(num1-> System.out.println(num1));}public static Optional<Integer> getNum(){Integer a= null;return a==null?Optional.empty():Optional.of(a);}
}

所以,还是ofNullable方法用的比较多,empty和of方法比较少用。

判断

ifPresent

会判断封装的数据是否为空,不为空时才会执行具体的操作,可以安全的消费值

isPresent

会判断封装的数据是否为空,为空返回false,不为空返回true。

package com;import java.util.Optional;public class OptionalTest07 {public static void main(String[] args) {Optional<Integer> num = getNum();if(num.isPresent()){System.out.println(num.get());}else{System.out.println("value is null");}}public static Optional<Integer> getNum(){Integer a= null;return Optional.ofNullable(a);}
}

安全的获取值

orElseGet

安全的获取值,如果optional对象没有值,则返回设置的值,如果有值,则获得值。

package com;import java.util.Optional;public class OptionalTest04 {public static void main(String[] args) {Optional<Integer> num = getNum();Integer integer = num.orElseGet(() -> 2);System.out.println(integer);}public static Optional<Integer> getNum(){Integer a= null;return Optional.ofNullable(a);}
}

在这里插入图片描述

orElseThrow

获取数据的时候,如果值为空,那么会抛出指定的异常。方便springboot的统一异常的处理。

package com;import java.util.Optional;public class OptionalTest05 {public static void main(String[] args) {Optional<Integer> num = getNum();try {Integer integer = num.orElseThrow(() -> new RuntimeException("value is null"));System.out.println(integer);}catch (Throwable e){e.printStackTrace();}}public static Optional<Integer> getNum(){Integer a= null;return Optional.ofNullable(a);}
}

过滤

可以使用filter方法进行过滤,如果都不符合过滤条件,optional还是会变成一个null的对象。

package com;import java.util.Optional;public class OptionalTest06 {public static void main(String[] args) {Optional<Integer> num = getNum();Optional<Integer> integer = num.filter(a -> a > 5);integer.ifPresent(b-> System.out.println(b));}public static Optional<Integer> getNum(){Integer a= 2;return Optional.ofNullable(a);}
}

在这里插入图片描述

函数式接口

只有一个抽象方法的接口就是函数式接口,函数式接口可以用注解@FunctionalInterface修饰,也可以没有这个注解

常见的函数式接口

  • consumer:消费接口,可以对传入方法的参数做操作,没有返回值
  • function:计算转换接口,可以对传入方法的参数做计算或转换,有返回值
  • predictate:判断接口,可以对传入方法的参数条件判断,返回boolean
  • supplier:可以在方法中创建对象并返回。

方法引用

使用lambada表达式的时候,如果方法体只有一个方法的调用,可以使用方法引用进一步简化代码。
这个其实是作为了解的,没有必要为了简化而简化。遇到这种写法的时候知道就好了

格式

引用类的静态方法时:类名:: 方法名
引用对象的实例方法时:对象名:: 方法名
构造器引用:类名::new

num.ifPresent(num1-> System.out.println(num1));可以改成num.ifPresent(System.out::println);
在lambada式上,alt+回车,如果有图中的选项,则可以使用方法引用的方式简化代码。
在这里插入图片描述

stream流的优化

基本数据类型优化

很多的stream流中的方法,都是使用了泛型的,所以涉及到的参数和返回值都是引用数据类型。在方法中,会有很多的装箱拆箱的操作,会损耗性能,比如authors.stream().map(author -> author.getAge());这个代码中,传入的参数a是Integer的,在比较的时候,会拆箱为int,然后结果又要装箱成integer。
常用的优化方法:

  • mapToInt
  • mapToLong
  • mapToDouble
  • flatToDouble
  • flatToInt

并行流

stream流中有大量的数据时,可以使用并行流去提高效率,它会把任务分配给多个线程去操作。它不需要我们手动去实现复杂的多线程编程,而是直接调用parallel方法或者通过parallelStream直接获取并行流对象

parallel方法

package com;import java.util.stream.Stream;public class StreamTest6 {public static void main(String[] args) {Integer[] arr =  {1,1,2,2,3,3,4,4,5,6};Stream.of(arr).parallel().peek(n-> System.out.println(n+Thread.currentThread().getName())).distinct().forEach(arr3-> System.out.println(arr3));}
}

解析:
这个peek方法是stream流中的调试线程方法
在这里插入图片描述
如果不是用parallel方法,输出结果是:
在这里插入图片描述
可以看到是只有一个线程的。

parallelStream方法

package com;import java.util.ArrayList;
import java.util.List;public class StreamTest4 {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.parallelStream().peek(n-> System.out.println(n+Thread.currentThread().getName())).forEach(i-> System.out.println(i));}
}

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

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

相关文章

Python编程入门指南:从基础到高级

Python编程入门指南&#xff1a;从基础到高级 一、Python编程语言简介 1. Python是什么&#xff1f; Python是一门广泛使用的计算机程序编程语言&#xff0c;由荷兰人吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;于1991年首次发行。Python是一种解释型、交互式、面…

汽车免拆诊断案例 | 2018 款别克阅朗车蓄电池偶尔亏电

故障现象 一辆2018款别克阅朗车&#xff0c;搭载LI6发动机和GF6变速器&#xff0c;累计行驶里程约为9.6万km。车主反映&#xff0c;该车停放一晚后&#xff0c;蓄电池偶尔亏电。 故障诊断 接车后用虹科Pico汽车示波器和高精度电流钳&#xff08;30 A&#xff09;测量该车的寄…

Spring AOP(2)原理(代理模式和源码解析)

目录 一、代理模式 二、静态代理 三、动态代理 1、JDK动态代理 &#xff08;1&#xff09;JDK动态代理实现步骤 &#xff08;2&#xff09;定义JDK动态代理类 &#xff08;3&#xff09;代码简单讲解 2、CGLIB动态代理 &#xff08;1&#xff09;CGLIB 动态代理类实现…

k8s中的重启策略

一、k8s的pod&#xff0c;kill进程和上节点停止容器&#xff0c;容器是否被重启&#xff08;重启策略为OnFailure&#xff09;&#xff1a; 解释&#xff1a;docker ps -a看到容器退出码为&#xff1a; kill进程&#xff0c;其容器退出码为&#xff1a;exit(137)stop 容器&am…

【数据结构】稀疏数组

问题引导 在编写五子棋程序的时候&#xff0c;有“存盘退出”和“续上盘”的功能。现在我们要把一个棋盘保存起来&#xff0c;容易想到用二维数组的方式把棋盘表示出来&#xff0c;但是由于在数组中很多数值取默认值0&#xff0c;因此记录了很多没有意义的数据。此时我们使用稀…

Apache压测工具ab(Apache Bench)工具的下载安装和使用示例

场景 Jmeter进行http接口压力测试&#xff1a; Jmeter进行http接口压力测试_接口压测两万量-CSDN博客 上面讲压测工具Jmeter的使用&#xff0c;下面介绍另外一个ab(Apache Bench)压测工具的使用。 apache bench apache bench是apache自带的压力测试工具。 ab不仅可以对ap…

构件组装不兼容-系统架构师(三十三)

1、&#xff08;系统工程与信息系统基础->信息系统战略规划&#xff09;企业信息化程度是国家信息化建设的基础和关键&#xff0c;企业信息化方法不包括&#xff08;&#xff09;。 A业务流程重组 B组织机构变革 C供应链管理 D人力资本投入 解析&#xff1a; 企业信息化…

CSS 创建:从入门到精通

CSS 创建:从入门到精通 CSS(层叠样式表)是网页设计中不可或缺的一部分,它用于控制网页的布局和样式。本文将详细介绍CSS的创建过程,包括基本概念、语法结构、选择器、样式属性以及如何将CSS应用到HTML中。无论您是初学者还是有经验的开发者,本文都将为您提供宝贵的信息。…

awk的模式

在awk 中&#xff0c;匹配模式处于非常重要的地位&#xff0c;它决定着匹配模式后面的操作会影响到哪些文本行。 awk 中 的匹配模式主要包括关系表达式、正则表达式、混合模式&#xff0c; BEGIN 模式以及 END 模式等。 &#xff08; 1 &#xff09;关系表达式 awk 提供了许…

localSorage,sessionStorage,cookie三者的区别和特点

LocalStorage、SessionStorage、Cookie三者的区别和特点? 什么是Cookie HTTP协议本身是无状态的。什么是无状态呢&#xff0c;即服务器无法判断用户身份。 Cookie实际上是一小段的文本信息&#xff08;key-value格式&#xff09;。客户端向服务器发起请求&#xff0c;如果服务…

培训第十三天(DNS逆向解析与主从服务、ntp时间服务器)

上午 编号主机名ip地址说明修改1web服务器10.0.0.10发布部署web服务发布了一个nginx web服务2dns服务器10.0.0.11用于解析域名和ip地址1、安装bind 2、配置一个conf&#xff0c;zones&#xff0c;zone 3、检查了3个文件&#xff0c;启动3cli主机10.0.0.12用于模拟客户机修改了…

基于联盟链Fabric 2.X 的中药饮片代煎配送服务与监管平台

业务背景 近年来&#xff0c;随着公众对中医药青睐有加&#xff0c;中药代煎服务作为中医药现代化的重要一环&#xff0c;在全国各地蓬勃兴起。鉴于传统煎煮方式的繁琐耗时&#xff0c;医疗机构纷纷转向与第三方中药饮片企业合作&#xff0c;采用集中代煎模式。这些第三方煎药中…

没有51基础,能不能学好STM32?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 我们通常准备攻读一本大部…

【HTML】iframe

<iframe> 标签是 HTML 中的⼀个元素&#xff0c;⽤于在当前 HTML ⽂档中嵌⼊另⼀个 HTML ⽂档。它可以在⼀个 HTML ⻚⾯中嵌⼊另⼀个 HTML ⻚⾯或其他类型的⽂档&#xff0c;⽐如 PDF ⽂件或视频⽂件。 <iframe> 标签的优点包括&#xff1a; 可以让⻚⾯嵌⼊其他⽹…

浅谈监听器之断言结果

浅谈监听器之断言结果 在进行测试过程中&#xff0c;断言是一种关键组件&#xff0c;用于验证采样器&#xff08;如HTTP请求&#xff09;的响应数据是否符合预期。而“断言结果”监听器则是展示这些断言执行情况的重要工具&#xff0c;它帮助用户快速识别哪些断言通过或未通过…

JavaScript轮播图

HTML部分 <div class"box" onmouseover"over()" onmouseout"noover()"><img src"./img/zuo.png" alt"" class"left_arrow" onclick"left_last()"><img src"./img/yy.png" al…

【JAVA多线程】线程的状态控制

目录 1.JDK中的线程状态 2.基础操作 2.1关闭 2.2中断 2.3.等待、唤醒 2.4.阻塞、唤醒 1.JDK中的线程状态 在JDK的线程体系中线程一共6种状态&#xff1a; NEW&#xff08;新建&#xff09;: 当线程对象创建后&#xff0c;但尚未启动时&#xff0c;线程处于新建状态。RUN…

python毕业设计选题校园食堂菜谱推荐系统

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

stack(leetcode练习题,牛客)

文章目录 STL用法总结32 最长有效括号思路代码 496 下一个最大元素思路代码 856 括号的分数思路 最优屏障思路代码 STL用法总结 关于stack的知识&#xff0c;可以看点击查看上面的博客&#xff0c;以下题目前三个全在leetcode&#xff0c;最后一个在牛客 32 最长有效括号 思路…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十章 Linux设备树

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…