微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Stream 流的使用过程解析

这篇文章主要介绍了Java Stream 流的使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1. 筛选和切片

用谓词筛选filter方法接受一个返回boolean的方法。List vegetarianMenu=menu.stream().filter(dish::isvegetarian) .collect(toList());distinct去重distinct方法,根据流中元素的hashCode和equals方法。例:List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream().filter(i -> i % 2 == 0).distinct().forEach(System.out::println);截短流limit(n)方法,该方法会返回一个不超过给定长度的流。如果流是有序的,则最多会返回前n个元素。limit也可以用在无序流上,比如源是一个Set。这种情况下,limit的结果不会以任何顺序排列。List dishes = menu.stream() .filter(d -> d.getCalories() > 300).limit(3).collect(toList());跳过元素skip(n)方法返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流。skip方法和limit方法可以看成是相反的操作。2. 映射简单映射流支持map方法,它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素。下面的代码,对words中的所有字符串应用String::length方法。List words = Arrays.asList("Java 8", "Lambdas", "In", "Action"); List wordLengths = words.stream().map(String::length).collect(toList());流的扁平化什么叫扁平化?举个例子:把Stream> 变成 Steam 就叫扁平化。一言以蔽之,flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。List words = Arrays.asList("Java 8", "Lambdas", "In", "Action"); //map函数中每个字符串都被切割为字符串数组,返回一个字符串数组的流 List collect = words.stream() .map(word -> word.split("")) .distinct() .collect(toList()); //Arrays.stram方法接受一个数组返回一个流 String[] arrayOfWords = {"Goodbye", "World"}; Stream streamOfwords = Arrays.stream(arrayOfWords); //第一个map返回一个字符串流,流中的元素是一个个的字符串数组。 //第二个map对每一个字符数组应用Arrays.stream函数,所以每一个字 //符串数组映射为一个字符串流。 List> collect1 = words.stream() .map(word -> word.split("")) .map(v -> Arrays.stream(v)) .distinct() .collect(toList()); //第一个map返回一个字符串流,流中的元素是一个个的字符串数组。 //flatMap方法把流中的每个字符串数组都换成一个流,然后连接它们成 //为一个流 List uniqueCharacters = 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() d.getCalories()查找元素findAny方法将返回当前流中的任意元素。Optional dish = menu.stream().filter(dish::isvegetarian).findAny();Optional是什么?查找第一个元素List someNumbers = Arrays.asList(1, 2, 3, 2, 5); //filter返回一个流,findfirst在该流中找第一个 Optional firstSquareDivisibleByThree = 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,赶紧用起来吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐