c语言sscanf函数的用法是什么
209
2023-06-04
Java Stream 流的使用过程解析
1. 筛选和切片
用谓词筛选
filter方法接受一个返回boolean的方法。
List
distinct去重
distinct方法,根据流中元素的hashCode和equals方法。例:
List
numbers.stream().filter(i -> i % 2 == 0).distinct().forEach(System.out::println);
截短流
limit(n)方法,该方法会返回一个不超过给定长度的流。
如果流是有序的,则最多会返回前n个元素。
limit也可以用在无序流上,比如源是一个Set。这种情况下,limit的结果不会以任何顺序排列。
List
跳过元素
skip(n)方法返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流。skip方法和limit方法可以看成是相反的操作。
2. 映射
简单映射
流支持map方法,它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素。
下面的代码,对words中的所有字符串应用String::length方法。
List
List
流的扁平化
什么叫扁平化?举个例子:把Stream
一言以蔽之,flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。
List
//map函数中每个字符串都被切割为字符串数组,返回一个字符串数组的流
List
.map(word -> word.split(""))
.distinct()
.collect(toList());
//Arrays.stram方法接受一个数组返回一个流
String[] arrayOfWords = {"Goodbye", "World"};
Stream
//第一个map返回一个字符串流,流中的元素是一个个的字符串数组。
//第二个map对每一个字符数组应用Arrays.stream函数,所以每一个字 //符串数组映射为一个字符串流。
List
.map(word -> word.split(""))
.map(v -> Arrays.stream(v))
.distinct()
.collect(toList());
//第一个map返回一个字符串流,流中的元素是一个个的字符串数组。
//flatMap方法把流中的每个字符串数组都换成一个流,然后连接它们成 //为一个流
List
words.stream()
.map(w -> w.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList());
3. 查找和匹配
另一个常见的数据处理套路是看看数据集中的某些元素是否匹配一个给定的属性。Stream API通过allMatch、anyMatch、noneMatch、findFirst、findAny方法提供了这样的工具。
注:这些工具方法的返回值都不是流。所以它们是终端操作
检查谓词是否至少匹配一个元素
if(menu.stream().anyMatch(Dish::isVegetarian)){
System.out.println("The menu is (somewhat) vegetarian friendly!!");
}
检查谓词是否匹配所有元素
//是否所有元素都匹配
boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000);
//是否所有元素都 不 匹配
boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000);
查找元素
findAny方法将返回当前流中的任意元素。
Optional
Optional是什么?
查找第一个元素
List
//filter返回一个流,findfirst在该流中找第一个
Optional
someNumbers.stream()
.filter(x -> x == 2)
.findFirst();
4. 归约
归约:将流中的元素相互结合起来,求一个值。比如学生是元素求分数最高的学生、分数是元素求某位同学的总分。
//求numbers中所有数值的集合
int product = numbers.stream().reduce(1, (a, b) -> a * b);
一个初始值,这里是0;
一个BinaryOperator来将两个元素结合起来产生一个新值,这里我们用的是
lambda (a, b) -> a + b。
无初始值
reduce还有一个重载的变体,它不接受初始值,但是会返回一个Optional对象:
Optional sum = numbers.stream().reduce((a, b) -> (a + b));
小结
该篇对于流的使用,做了简要的笔记。可以满足大多数情况的需求。不要只是看看,不要只是做了笔记。这么好用的api,赶紧用起来吧。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~