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

public static void test_reduce_caluli(List menu) {

int calories = menu.stream()

.map(Dish::getCalories)

.reduce(0, Integer::sum);

System.out.println(“菜品中的总卡路里:” + calories);

}

上面包含了一个基本数据类型的装箱/拆箱动作,java8的流API提供了mapToInt方法,直接返回int类型的流

我们先稍微看一下mapToInt的方法声明:

IntStream mapToInt(ToIntFunction<? super T> mapper)

接受一个T->int的函数式编程接口,直接返回IntStream流对象,而且IntStream本身提供了一些常用的聚合函数,例如sum。

使用IntStream来实现计算菜单中所有菜品的卡路里之和,其示例如下:

public static void test_reduce_caluli_intStream(List menu) {

int calories = menu.stream()

.mapToInt(Dish::getCalories)

.sum();

System.out.println(“菜品中的总卡路里:” + calories);

}

1.1.2 转换回对象流

使用了特化流例如IntStream后,将不能再自动转换为其对应的封装对象流Stream< T >了,我们可以随意从IntStream对象中对应的通用方法的函数声明,例如IntStream#map函数的声明如下:

IntStream map(IntUnaryOperator mapper);

只能接受int -> int的函数式编程接口,如果想将IntStream转回到Stream< Integer >,该如何处理呢?

IntStream提供了boxed()方法来实现将基础数据类型转换回对应的包装类型的流。

1.1.3 常用函数

Stream中定义的方法,IntStream也可以使用,例如map、flatMap、distinict等,IntStream除这些之外,还提供了常用的聚合函数,例如sum、min、max、average(平均数)。

OptionalDouble average();

OptionalInt max();

OptionalInt min();

int sum();

有关Optional相关的类将在下文详细介绍。

另外除了上面提到的聚合函数,IntStream还提供了两个与数值范围的方法:

public static IntStream range(int startInclusive, int endExclusive);

public static IntStream rangeClosed(int startInclusive, int endExclusive);

rangeClosed与range的区别就是rangeClosed包含结束边界,举一个简单示例如下:

public static void test_range() {

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类。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
…(img-ZjtYCBd6-1715710108717)]

[外链图片转存中…(img-5nggzcrR-1715710108718)]

[外链图片转存中…(img-8KEM9t01-1715710108718)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值