java8实战读书笔记:数值流、Stream创建与Optional类的使用

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

long count = IntStream.range(1,100)

.filter( i -> i % 2 == 0 )

.count();

System.out.println(“count:” + count);

}

计算【1,100)中包含的偶数个数,将输出49。如果将range(1,100)修改为rangeClosed(1,100),在输出的个数为50。

2、构建流


2.1 通过值构建流

java 8的Stream提供了两个重载的of函数来显示的构建流,其声明如下:

public static Stream of(T t)

public static Stream of(T… values)

2.2 通过数组构建流

通过Arrays.stream构建流,其声明如下:

Arrays#stream

public static Stream stream(T[] array)

2.3 通过文件流

可以通过文件流创建流,在java.nio.file.Files类中定义了如下创建流的方法。

public static Stream list(Path dir) throws IOException

public static Stream walk(Path start, int maxDepth, FileVisitOption… options)

public static Stream walk(Path start, FileVisitOption… options)

public static Stream find(Path start, int maxDepth,BiPredicate<Path, BasicFileAttributes> matcher,

FileVisitOption… options)

public static Stream lines(Path path, Charset cs)

public static Stream lines(Path path) throws IOException

下面我们举一个示例:找出一个文件中不同词的个数。

public static void test_file_stram() {

long uniqueWords = 0;

try(Stream lines = Files.lines(Paths.get(“d:/tmp/words.txt”), Charset.defaultCharset())) {

uniqueWords = lines.flatMap(line -> Arrays.stream(line.split(“” )))

.distinct()

.count();

System.out.println(“不重复字符个数:” + uniqueWords);

} catch (IOException e) {

e.printStackTrace();

}

}

2.4 函数生成流:创建无限流

Stream API提供了两个静态方法从函数生成流:iterate、generate,我们先来看一下其函数声明:

public static Stream iterate(final T seed, final UnaryOperator f)

public static Stream generate(Supplier s)

2.4.1 iterate

iterate方法的第一个参数类型为T,表示其初始值,第二个参数如下:

在这里插入图片描述

即其函数式声明为为T-T。其示例如下:

public static void test_iterate() {

Stream.iterate(0, a -> a + 2)

.limit(10)

.forEach(System.out::println);

}

注意:由于是无限流,故千万记得使用limit截断流,否则会无限循环下去。

2.4.2 generate

其参数为Supplier< T >,其定义如下:

在这里插入图片描述

即构造一个T类型的对象,举例如下:

public static void test_iterate() {

Stream.iterate(0, a -> a + 2)

.limit(10)

.forEach(System.out::println);

}

2.5 集合对象的stream

这个在前面的示例中用的最多,就不做过多介绍。

3、Optional类


为了更优雅的处理null值,避免空指针错误,java8中引入Optional类。

在这里插入图片描述

接下来对这些方法一一做个介绍。

  • public static< T> Optional< T> empty()

创建一个Optional对象,其内部持有的对象为null。

  • public static < T > Optional< T > of(T value)

使用value的值,创建一个Optional对象。

  • public static < T > Optional< T > ofNullable(T value)

使用v去创建一个Optional对象,如果value为null,则返回empty()。

  • public T get()

从Optional对象获取内嵌的对象,如果为空,则抛出NoSuchElementException。

  • public boolean isPresent()

判断Optional对象中包含的值是否存在。

  • public void ifPresent(Consumer<? super T> consumer)

如果Optional包裹的对象存在,则消费该对象。Consumer<?>的函数式编程接口:T -> void。

  • public Optional< T > filter(Predicate<? super T> predicate)

如果Optional中包裹的对象为空,则返回自身,否则如果包裹的对象满足predicate表达式,则返回自身,否则返回empty()。

  • public< U > Optional< U > map(Function<? super T, ? extends U> mapper)

如果Optional对象中包裹的对象为空,则返回empty(),否则运用(T-U),包裹U,当然如果U为空,则返回empty()。

  • public< U > Optional< U > flatMap(Function<? super T, Optional< U >> mapper)

如果Option对象中包裹的对象为空,则返回empty(),否则使用对Optional中的包裹的对象value应用Function,最终返回Optional对象。

  • public T orElse(T other)

返回Optional中包裹的对象,如果其值为空,则返回other。

  • public T orElseGet(Supplier<? extends T> other)

返回Optional中包裹的对象,如果其值为空,则返回 Supplier函数式编辑接口中创建的值。

  • public < X extends Throwable> T orElseThrow(Supplier< ? extends X> exceptionSupplier) throws X

返回Optional中包裹的对象,如果其值为空,则抛出自定义一次,由Supplier函数式编程接口返回。

其示例代码如下:

public static void test_option() {

Map<String, String> data = new HashMap<>();

Optional value = Optional.ofNullable(data.get(“userName”));

// 如果存在userName值,则输出

value.ifPresent(System.out::println);

}

本文就介绍到这里了,本文详细介绍了java8中的数值流、Stream的创建以及java8中Optional类的使用。


欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:

1、源码分析RocketMQ专栏(40篇+)

2、源码分析Sentinel专栏(12篇+)

3、源码分析Dubbo专栏(28篇+)

4、源码分析Mybatis专栏

5、源码分析Netty专栏(18篇+)
6、源码分析JUC专栏
7、源码分析Elasticjob专栏

最后

由于篇幅原因,就不多做展示了

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

13610682004)]

[外链图片转存中…(img-Y1YAZZaM-1713610682004)]

[外链图片转存中…(img-OFeQbY2j-1713610682005)]

由于篇幅原因,就不多做展示了

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-tXwjswrO-1713610682005)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值