Java8——Stream流的使用(查找操作)

Stream提供了findFirst查找第一个流元素和findAny查找任意一个流元素的两个方法,但是没有提供其他的查找操作!

  Stream提供了findFirst查找第一个流元素和findAny查找任意一个流元素的两个方法,但是没有提供其他的查找操作!
  查找操作是一个终端操作!

Optional< T > findFirst()

  返回此流的第一个元素的Optional。如果流为空,则返回一个空的Optional,如果源数据没有顺序,则可能会返回任何元素。

Optional< T > findAny()

  返回此流的任意一个元素的Optional。如果流为空,则返回一个空的Optional,如果源数据没有顺序,则可能会返回任何元素。这个方法主要是为了并行流的效率考虑的,如果是单线程下也是返回第一个流元素!

使用案例:

@Test
public void find() {
    Optional<String> first = Stream.of("xx", "ccc", "eee").findFirst();
    Optional<String> any = Stream.of("xx", "ccc", "eee").findAny();

    //通常我们这样使用
    //如果first存在
    if (first.isPresent()) {
        String s = first.get();
    }
    //如果any存在
    if (any.isPresent()) {
        String s = any.get();
    }
    
    //或者这样用
    first.ifPresent(System.out::println);
}

  find方法没啥好说的,但是我们注意它的返回的结果是一个Optional类型的对象,Optional是Java8新增的类,算作Java8的新特性,这个类实际上是希望帮助程序员避免空指针异常而添加的!

 Optional容器对象

  Optional< T >类(java.util.Optional)是一个容器类,代表一个值存在或不存在。在上面的代码中,findAny可能什么元素都没找到,如果此时返回一个原始类型的null,那么粗心的程序员可能就忘记null校验而导致程序异常了,因此返回一个一定不为null的Optional对象,这个对象将真正的返回值包装起来,通过一系列方法获取值或者进行其他操作!

方法
说明
public boolean isPresent()
如果存在值,则返回 true ,否则为 false 。
public T get()
如果 Optional中存在值,则返回值,否则抛出 NoSuchElementException 。
public void ifPresent(Consumer<? super T> consumer)
如果存在值,则使用该值作为参数调用指定的消费者,否则不执行任何操作。如果值存在且consumer为空,那么抛出NullPointerException。
public T orElse(T other)
返回值(如果存在),否则返回一个默认值。
public T orElseGet(Supplier<? extends T> other)
返回值(如果存在),否则调用 other并返回该调用的结果。
public T orElseThrow(Supplier<? extends X> exceptionSupplier)
返回包含的值(如果存在),否则抛出由Supplier参数返回的异常。如果没有值,则抛出指定异常;如果没有值且exceptionSupplier为空,则抛出NullPointerException。


方法
说明
public static < T > Optional< T > empty()
返回一个空的Optional实例。
public static < T > Optional< T > of(T value)
返回具有非空值的Optional。如果value为null,那么抛出NullPointerException。
public static < T > Optional< T > ofNullable(T value)
返回具有指定值的Optional。value可以为null。
public Optional< T > filter(Predicate<? super T> predicate)
如果一个值存在,并且该值给定的断言相匹配时,返回一个 包含此值的Optional,否则返回一个空的 Optional 。如果断言为null,那么抛出NullPointerException。
public < U > Optional< U > map(Function<? super T,? extends U> mapper)
如果存在值,则应用提供的映射函数,如果结果不为空,则返回一个包含此结果的Optional。否则返回一个空的Optional 。如果函数为null,那么抛出NullPointerException。
public < U > Optional< U > flatMap(Function<? super T,Optional< U >> mapper)
如果一个值存在,则应用提供的映射函数,返回的结果一定是一个Optional,这个Optional包含了真实结果,如果真实结果为null,则返回一个空的Optional。如果函数为null或者返回null结果,那么抛出NullPointerException。

使用案例:

@Test
public void optional() {
    System.out.println("filter");
    System.out.println(Optional.of(3).filter(integer -> integer > 2));
    System.out.println(Optional.of(3).filter(integer -> integer > 3));

    System.out.println("map");
    System.out.println(Optional.of(3).map(integer -> integer + 2));
    System.out.println(Optional.of(2).map(integer -> integer + 2));

    System.out.println("flatMap");
    System.out.println(Optional.of(3).flatMap(integer -> Optional.of(integer + 2)));
    System.out.println(Optional.of(2).flatMap(integer -> Optional.of(integer + 2)));
    //map对比,可以看到和Stream的flatMap与map方法差不多
    System.out.println(Optional.of(2).map(integer -> Optional.of(integer + 2)));
}

  • 发表于 2020-09-16 16:02
  • 阅读 ( 25 )

0 条评论

请先 登录 后评论
NX小编
NX小编

1209 篇文章

作家榜 »

  1. NX小编 1209 文章
  2. 58沈剑 309 文章
  3. 奈学教育 137 文章
  4. 李希沅 | 奈学教育 36 文章
  5. 江帅帅 | 奈学教育 29 文章
  6. 林淮川 | 奈学教育 12 文章
  7. 科技热点 10 文章
  8. 邱鹏超 2 文章