【Java8新特性】Optional+Stream+Lambda表达式

本文介绍了Java8的三大重要特性:Optional用于防止空指针异常,提供了一种更安全的值封装方式;Stream是一个元素序列,支持聚合操作,与传统集合不同的是它不会存储元素而是按需计算;Lambda表达式简化了函数式编程,使得代码更简洁。文中通过示例详细解释了这三个特性的使用方法和应用场景。
摘要由CSDN通过智能技术生成

【Java8新特性】Optional+Stream+Lambda表达式

学习目标:学习Java8新特性

  • Optional是什么,有什么用处,一般如何使用

  • Stream是什么,与传统的集合相比有什么差异不同

  • lambda主要是实战,编写几个简单是示例:过滤,排序,收集为List(Map),去重,截取,分组 等

1.Optional

一篇博文介绍Optional类

从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。

本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。

Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。

JDK文档资料:

Class Optional


public final class Optional<T>
extends Object

可能包含或不包含非空值的容器对象。如果一个值存在, isPresent()将返回trueget()将返回值。

提供依赖于存在或不存在包含值的其他方法,例如orElse() (如果值不存在则返回默认值)和ifPresent() (如果值存在执行代码块)。

这是一个value-based课; 使用身份敏感的操作(包括引用相等(的==上的实例),标识哈希码,或同步) Optional可具有不可预测的结果,应当避免。

菜鸟教程 Optional类

使用 of() 和 ofNullable() 方法创建包含值的 Optional。两个方法的不同之处在于如果你把 null 值作为参数传递进去,of() 方法会抛出 NullPointerException

package study20210128;

import java.util.Optional;

public class OptionalTest {
	public static void main(String[] args) {

		OptionalTest optionalTest = new OptionalTest();
		Integer value1 = null;
		Integer value2 = new Integer(10);

		// Optional.ofNullable - 允许传递为 null 参数
		Optional<Integer> a = Optional.ofNullable(value1);

		// Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
		Optional<Integer> b = Optional.of(value2);
		System.out.println(sum(a,b));
	}
	public static Integer sum(Optional<Integer>a,Optional<Integer>b) {
		// Optional.isPresent - 判断值是否存在
		System.out.println("第一个参数值是否存在:"+a.isPresent());
		System.out.println("第一个参数值是否存在:"+b.isPresent());
		
		// Optional.orElse - 如果值存在,返回它,否则返回默认值
		Integer value1 = a.orElse(new Integer(0));

		
		//Optional.get - 获取值,值需要存在
		Integer value2=b.get();
		return value1+value2;
	}
}

2.Stream

菜鸟教程 Stream

一篇CSDN博文

Stream(流)是一个来自数据源元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  • Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

3.Lambda表达式

菜鸟教程

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

以下是lambda表达式的重要特征:
  • **可选类型声明:**不需要声明参数类型,编译器可以统一识别参数值。
  • **可选的参数圆括号:**一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • **可选的大括号:**如果主体包含了一个语句,就不需要使用大括号。
    **可选类型声明:**不需要声明参数类型,编译器可以统一识别参数值。
  • **可选的参数圆括号:**一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • **可选的大括号:**如果主体包含了一个语句,就不需要使用大括号。
  • **可选的返回关键字:**如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小达学加瓦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值