乐趣区

Stream-API和Optional类学习笔记

Stream API

Stream API 是 Java8 的新特性,通常用于对集合进行一些操作,可以帮助开发者写出更高效、整洁的代码。

一、Stream 流的创建

1、通过已有的集合来创建流,这种方式使用的比较多

List<String> strings = Arrays.asList("hushucheng", "hufanqie", "hututu", "marong", "marongrong");
Stream<String> stream = strings.stream();

2、使用 stream 来创建

Stream<String> stream = Stream.of("hushucheng", "hufanqie", "hututu", "marong", "marongrong");

二、中间操作

1、filter
用法如下:

        List<String> strings = Arrays.asList("hushucheng","","hufanqie","hututu","marong","marongrong");
        strings.stream().filter(string -> !string.isEmpty()).forEach(System.out::println);

在例子中,过滤了空字符串。

2、map
用法如下:

        List<String> strings = Arrays.asList("hushucheng","hufanqie", "hututu", "marong", "marongrong");
        strings.stream().map(string -> string.toUpperCase()).forEach(System.out::println);

在例子中,将单词全部映射为大写

3、limit
用法如下:

        List<String> strings = Arrays.asList("hushucheng","hufanqie", "hututu", "marong", "marongrong");
        strings.stream().map(string -> string.toUpperCase()).limit(4).forEach(System.out::println);

用来限制返回的个数

4、skip
用法类似 limit,用来跳过若干个数。

5、sorted
用于对流进行排序。

        List<Integer> strings = Arrays.asList(1, 3, 3, 2, 5, 4);
        strings.stream().sorted().forEach(System.out::println);

6、distinct
用于去重。用法略。

三、最终操作

1、forEach
用于迭代流中的每个元素,并执行相应的操作。比如前面的例子中都用到了。

2、collect
将流中的元素累积成一个汇总结果。

List<Integer> strings = Arrays.asList(1, 3, 3, 2, 5, 4);
strings = strings.stream().sorted().collect(Collectors.toList());

3、count
统计流中元素个数。

Optional 类

Optional 类也是 Java8 的新特性,用于有效解决 NPE 问题。

一、Optional 对象的创建

1、empty方法创建一个空对象

Optional<String> s1 = Optional.empty();

2、of方法可以创建一个非空对象

Optional<String> s2 = Optional.of("marong");

3、ofNullable 方 法可以创建一个可以为空的对象

Optional<String> s3 = Optional.ofNullable("marongrong");

二、常用方法

1、ifPresent 和 isPresent
(1) 调用 ifPresent 方法,则对象不为空执行相关操作。
(2) 调用 isPresent 方法可以判断对象是否为空。

2、orElseorElseThroworElseGet
(1) orElse

 System.out.println(s1.orElse("marong").equals("marong"));  \\true
 System.out.println(s3.orElse("marong").equals("marongrong"));  \\true

(2) orElseGet
与 orElse 的功能一样,不过接受一个函数式接口来生成对象

System.out.println(s1.orElseGet(String::new).equals(""));
System.out.println(s3.orElseGet(() -> "marongrong").equals("marongrong"));

(3) orElseThrow
orElseThrow 为空则抛出异常

s1.orElseThrow(IllegalStateException::new);

3、filter
与 Stream 使用类似

4、map
与 stream 使用类似

5、flatmap
这是一种级联的方式,能够解决 map 方式的 optional 嵌套问题。
http://www.hollischuang.com/w…

退出移动版