Java教程
+ -

Java Java 9 改进的 Optional 类

2019-09-09 7 0

Optional 类在 Java 8 中引入,Optional 类的引入很好的解决空指针异常。。在 java 9 中, 添加了三个方法来改进它的功能:

  • stream()
  • ifPresentOrElse()
  • or()

stream() 方法

语 法

public Stream<T> stream()

stream 方法的作用就是将 Optional 转为一个 Stream,如果该 Optional 中包含值,那么就返回包含这个值的
Stream,否则返回一个空的 Stream(Stream.empty())。

实例

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Tester {
public static void main(String[] args) {
   List<Optional<String>> list = Arrays.asList (
      Optional.empty(), 
      Optional.of("A"), 
      Optional.empty(), 
      Optional.of("B"));

      //filter the list based to print non-empty values

      //if optional is non-empty, get the value in stream, otherwise return empty
      List<String> filteredList = list.stream()
         .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
         .collect(Collectors.toList());

      //Optional::stream method will return a stream of either one 
      //or zero element if data is present or not.
      List<String> filteredListJava9 = list.stream()
         .flatMap(Optional::stream)
         .collect(Collectors.toList());

      System.out.println(filteredList);
      System.out.println(filteredListJava9);
   }

执行输出结果为:

[A, B]
[A, B]

ifPresentOrElse() 方法

语 法

public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)

ifPresentOrElse 方法的改进就是有了 else,接受两个参数 Consumer 和 Runnable。

ifPresentOrElse 方法的用途是,如果一个 Optional 包含值,则对其包含的值调用函数 action,即action.accept(value),这与 ifPresent 一致;与 ifPresent 方法的区别在于,ifPresentOrElse还有第二个参数 emptyAction —— 如果 Optional 不包含值,那么 ifPresentOrElse 便会调用
emptyAction,即 emptyAction.run()。

实例

import java.util.Optional;
public class Tester {
   public static void main(String[] args) {
      Optional<Integer> optional = Optional.of(1);
      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
         System.out.println("Not Present."));
      optional = Optional.empty();
      optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() -> 
         System.out.println("Not Present."));
   }  
}

执行输出结果为:

Value: 1
Not Present.

or() 方法

语 法

public Optional<T> or(Supplier<? extends Optional<? extends T#####@@@<@@@@@@## supplier)

如果值存在,返回 Optional 指定的值,否则返回一个预设的值。

实例

import java.util.Optional;
import java.util.function.Supplier;
public class Tester {
   public static void main(String[] args) {
      Optional<String> optional1 = Optional.of("Mahesh");
      Supplier<Optional<String#####@@@<@@@@@@## supplierString = () -> Optional.of("Not Present");
      optional1 = optional1.or( supplierString);
      optional1.ifPresent( x -> System.out.println("Value: " + x));
      optional1 = Optional.empty();    
      optional1 = optional1.or( supplierString);
      optional1.ifPresent( x -> System.out.println("Value: " + x));  
   }  
}

执行输出结果为:

Value: Mahesh
Value: Not Present

0 篇笔记 写笔记

C# Windows文件系统的操作
C# 允许您使用各种目录和文件相关的类来操作目录和文件,比如 DirectoryInfo 类和 FileInfo 类。DirectoryInfo 类DirectoryInfo 类派生自 FileSystemInfo 类。它提供了各种用于创建、移动、浏览目录和子目录的方法。该类不能被继承。下表列出了 ......
Java Java 8 Optional
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。Optional 类的......
C++标准库 fstream::rdbuf()函数
fstream::rdbuf()函数它返回一个指向内部filebuf对象的指针。声明下面是fstream::rduf()函数的声明。C++11filebuf* rdbuf() const;返回值它返回一个指向内部 filebuf 对象的指针。示例在下面的例子中解释了 fstream::rdbuf()......
Java Java8新特性
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。新特性Java8 新增了非常多的特性,我们主要......
Java ByteArrayOutputStream
字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。创建字节数组输出流对象有以下几种方式。下面的构造方法创建一个32字节(默认大小)的缓冲区。OutputStream bOut = new ByteArrayOutputStream();另一个构造方法创建一......
C++标准库 fstream运算符=
ostream运算符=它支持C++ 11标准版本的功能。它通过移动分配其成员和基类来获取右侧的内容。声明以下是ostream::operator=的声明 C++11copy (1) fstream& operator= (const fstream&) = delete;mov......
C# 文件的输入与输出
一个 文 件 是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个 流 。从根本上说,流是通过通信路径传递的字节序列。有两个主要的流: 输 入流 和 输 出流。 输 入流用于从文件读取数据(读操作),输 出流用于向文件写入数据(写操作)。C# I/O 类System.......
Java Java 9 改进的 Optional
Optional 类在 Java 8 中引入,Optional 类的引入很好的解决空指针异常。。在 java 9 中, 添加了三个方法来改进它的功能:stream()ifPresentOrElse()or()stream() 方法语 法public Stream stream()s......
Java ByteArrayInputStream
字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中。创建字节数组输入流对象有以下几种方式。接收字节数组作为参数创建:ByteArrayInputStream bArray = new ByteArrayInputStream(byte [] a);另一种创建方式......
C++ 文件和流
到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout方法分别用于从标准输入读取流和向标准输出写入流。本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库 fstream ,它定义了三个新的数据类型:数据类型描述 ofstream该数据类型表......
C++标准库 fstream::close()函数
关闭与当前对象关联的文件,将其与流分离。 如果流当前未与任何文件相关联(即,没有成功地打开文件),则调用此函数失败。声明以下是 fstream::close() 的声明。void close();注意,并发访问同一个流可能会引入数据竞争。示例在下面的例子中演示了 fstream::close() 函......
Java Java 8 Stream
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代......
Java DataOutputStream
数据输出流允许应用程序以与机器无关方式将Java基本数据类型写到底层输出流。下面的构造方法用来创建数据输出流对象。DataOutputStream out = new DataOutputStream(OutputStream out);创建对象成功后,可以参照以下列表给出的方法,对流进行写操作或......
C++标准库 fstream库
此数据类型通常用来表示文件流,并且具有 stream 和 ifstream 的能力,也就是说它可以创建文件,向文件写入信息和从文件读取信息。定义下面是 std::fstream 的定义。template< class CharT, class Traits = std::char_t......
C++标准库 fstream::isopen()函数
返回流当前是否与文件相关联。如果流可以通过成功调用成员函数打开或直接在构建时关联到文件,并通过调用close()函数关闭或销毁解离。流文件关联由其内部流缓冲区保存:在内部,函数调用rdbuf()->is_open()。声明以下是 fstream::is_open()函数的声明。C++98boo......
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!