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

news2024/9/22 18:28:08

简介

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.coloradmin.cn/o/1946836.html

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

相关文章

Linux shell编程学习笔记67: tracepath命令 追踪数据包的路由信息

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容&#xff0c;Linux和基于Linux的操作系统&#xff0c;提供了很多的网络命令&#xff0c;今天我们研究tracepath命令。 Tracepath 在大多数 Linux 发行版中都是可用的。如果在你的系统中没有预装&#xff0c;请根据你的…

四、GD32 MCU 常见外设介绍 (7) 7.I2C 模块介绍

7.1.I2C 基础知识 I2C(Inter-Integrated Circuit)总线是一种由Philips公司开发的两线式串行总线&#xff0c;用于内部IC控制的具有多端控制能力的双线双向串行数据总线系统&#xff0c;能够用于替代标准的并行总线&#xff0c;连接各种集成 电路和功能模块。I2C器件能够减少电…

Optima: 一个用于 Tapestri 平台的单细胞多组学数据分析的开源 R 包

分子条形码技术的最新进展使得在单细胞水平进行下一代转录组测序成为可能&#xff0c;例如10 Genomics Chromium和DropSeq。此外&#xff0c;CITE-seq 的出现使得可以在对单个细胞进行转录组分析的基础上同时对表面蛋白进行分析。同时&#xff0c;为了表征 DNA 和蛋白质谱&…

Harmony Next -- 图片选择库:宫格展示、全屏预览

hm_image_select_view OpenHarmony三方库中心仓&#xff1a;https://ohpm.openharmony.cn/#/cn/detail/image_select_view 介绍 Harmony Next 图片选择库&#xff0c;可设置最大选择数量、单行显示数量、横向竖向间隔&#xff1b;点击图片后全屏预览 软件架构 Harmony nex…

云计算复习--虚拟化技术

文章目录 虚拟化技术定义与原理虚拟机监视器&#xff08;VMM&#xff09;虚拟化技术服务器虚拟化存储虚拟化网络虚拟化应用虚拟化 关键技术新型虚拟化技术发展进展作业 虚拟化技术定义与原理 定义&#xff1a;虚拟化技术是一种将计算机物理实体&#xff08;如服务器、存储设备…

NOIP图论 最小生成树——Prim算法(详细图解)

最小生成树的概念 经典题目 prim算法简介 prim算法解析 &#xff08;详细图解&#xff09; 代码实现 代码实战 最小生成树的概念 在一给定的无向图G (V, E) 中&#xff0c;(u, v) 代表连接顶点 u 与顶点 v 的边&#xff0c;而 w(u, v) 代表此的边权重&#xff0c;若存在 …

AI绘画进阶工具 ComfyUI 新版来啦!操作界面详解!取消悬浮面板,自带工作流管理功能!(附安装包)

大家好&#xff0c;我是画画的小强 在 7 月初的一次更新中&#xff0c;ComfyUI 官方推出了 Beta 版 UI&#xff0c;取消了原本的悬浮面板&#xff0c;还新增了工作流管理功能&#xff0c;整体使用体验比之前好了很多。今天就为大家详细介绍一些新版 UI 的特点和用法。 一、启…

GraphRAG + GPT-4o mini 低成本构建 AI 图谱知识库

更好的效果&#xff0c;更低的价格&#xff0c;听起来是不是像梦呓&#xff1f; 限制 首先&#xff0c;让我们来介绍一个词&#xff1a;RAG。 简单来说&#xff0c;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 的工作原理是将大型文档…

每日一题 二叉树的中序遍历

1.题目描述 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 2.题目思路 遇到二叉树问题,首先考虑用递归来实现,首先它是中序遍历.我们可以拆分成子问题来解决,即先遍历二叉树的左子树,在遍历自身,在遍历右子树即可 3.代码书写 List<Integer> list …

免杀笔记 -->API的整理Shellcode加密(过DeFender)

最近更新频率明显下降我懒&#xff0c;那么今天就来记录一下我们的一些常用的API的整理以及ShellCode的加密。 1.WinAPI整理 问我为什么要整理&#xff1f; 就是用起来的时候要左翻右翻 &#xff1a;&#xff1a; 烦死了 1.VirtualAlloc VirtualAlloc(NULL,sizeof(buf),MEM_…

声音克隆一键本地化部署 GPT-SoVITS

文章目录 GPT-SoVITS 介绍1:GPT-SoVITS安装2:GPT-SoVITS使用2.1 人声伴奏分离,去混响去延时工具2.2 语音切分工具2.3 语音降噪工具2.4 中文批量离线ASR工具2.5 语音文本校对标注工具GPT-SoVITS 介绍 GPT-SoVITS: 是一个由RVC变声器创始人“花儿不哭”推出的免费开源项目。…

php 做一个mqtt按钮,发布触发信号

在之前博客php 做一个文件下载服务器&#xff0c;得避免跨路径工具&#xff0c;安全很重要 中加了一个按钮&#xff0c;触发物联网设备返回数据。基于mqtt开发&#xff0c;如果想知道mqtt如何搭建&#xff0c;可以看我的博客【MQTT&#xff08;1&#xff09;】服务端的搭建 效…

JavaEE - HTTP状态码

Web服务器 浏览器和服务器两端进行数据交互&#xff0c;使用的就是HTTP协议&#xff08;HTTP客⼾端和 HTTP服务器之间的交互数据 的格式&#xff09;。 Web服务器就是对HTTP协议进⾏封装,程序员不需要直接对协议进⾏操作(⾃⼰写代码去解析http协议 规则)&#xff0c;让Web开发更…

2 YOLO8的使用

1 介绍 YOLOv8是YOLO (You Only Look Once) 目标检测模型系列的最新版本&#xff0c;由Ultralytics公司开发和维护。YOLOv8是在先前版本的基础上进行的重大更新&#xff0c;不仅提升了性能&#xff0c;还增加了更多的功能&#xff0c;它不仅能够进行目标检测&#xff0c;还能完…

构建智慧水利系统,优化水资源管理:结合物联网、云计算等先进技术,打造全方位、高效的水利管理系统,实现水资源的最大化利用

本文关键词&#xff1a;智慧水利、智慧水利工程、智慧水利发展前景、智慧水利技术、智慧水利信息化系统、智慧水利解决方案、数字水利和智慧水利、数字水利工程、数字水利建设、数字水利概念、人水和协、智慧水库、智慧水库管理平台、智慧水库建设方案、智慧水库解决方案、智慧…

RBAC权限管理设置

RBAC权限管理设置 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;是一种常用的访问控制机制&#xff0c;用于管理系统中的用户权限。RBAC通过将用户分配给角色&#xff0c;并将权限授予角色&#xff0c;从而控制用户对资源的访问。 基…

BUU [BSidesCF 2020]Cards

BUU [BSidesCF 2020]Cards 开题&#xff1a; 做题目之前先了解一下21点的规则&#xff1a; 二十一点玩法规则和概率在二十一点游戏中&#xff0c;拥有最高点数的玩家获胜&#xff0c;其点数必须等于或低于21点&#xff1b;超过21点的玩家称为爆牌。 2点至10点的牌以牌面的点数…

谷歌新的网站索引策略:将来可能不再为您的网站编制索引

10 年前&#xff0c;在 WordPress 上推出新博客的同时&#xff0c;Google 上的内容几乎是即时索引。 搜索引擎试图尽快向用户提供所有信息&#xff0c;这对内容创作者也有利。 然而&#xff0c;随着时间的推移&#xff0c;情况发生了变化&#xff0c;现在谷歌在索引方面变得极…

RPA软件-影刀使用

流程自动化 影刀将操作进行抽象&#xff0c;分为一下几个对象&#xff1a; 网页自动化 &#xff08;1&#xff09; 网页自动化应用场景&#xff1a;网页操作、数据抓取 &#xff08;2&#xff09; 网页操作&#xff1a;基础操作-指令操作&#xff0c;智能操作-关联元素&#…

Redis-数据的极速之旅(一)

Redis基础篇 Redis的自我介绍我的核心数据结构1.字符串&#xff08;String&#xff09;2.哈希&#xff08;Hash&#xff09;3.列表&#xff08;List&#xff09;4.集合&#xff08;Set&#xff09;5.有序集合&#xff08;Sorted Set&#xff09; 高性能原理1.Redis为什么快&…