Java Stream 流的使用

目录

  • 1. 筛选和切片
  • 2. 映射
  • 3. 查找和匹配
  • 4. 归约
  • 小结

1. 筛选和切片

用谓词筛选

filter方法接受一个返回boolean的方法。

List<Dish> vegetarianMenu=menu.stream().filter(Dish::isVegetarian) .collect(toList());

distinct去重

distinct方法,根据流中元素的hashCode和equals方法。例:

List<Integer> 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<Dish> dishes = menu.stream() .filter(d -> d.getCalories() > 300).limit(3).collect(toList());

跳过元素

skip(n)方法返回一个扔掉了前n个元素的流。如果流中元素不足n个,则返回一个空流。skip方法和limit方法可以看成是相反的操作。

2. 映射

简单映射

流支持map方法,它会接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素。

下面的代码,对words中的所有字符串应用String::length方法。

List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action");
List<Integer> wordLengths = words.stream().map(String::length).collect(toList());

流的扁平化

什么叫扁平化?举个例子:把Stream<Stream< String >> 变成 Steam< String > 就叫扁平化。

一言以蔽之,flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流。

        List<String> words = Arrays.asList("Java 8", "Lambdas", "In", "Action");
        //map函数中每个字符串都被切割为字符串数组,返回一个字符串数组的流
        List<String[]> collect = words.stream()
                .map(word -> word.split(""))
                .distinct()
                .collect(toList());
        //Arrays.stram方法接受一个数组返回一个流
        String[] arrayOfWords = {"Goodbye", "World"};
        Stream<String> streamOfwords = Arrays.stream(arrayOfWords);

        //第一个map返回一个字符串流,流中的元素是一个个的字符串数组。
        //第二个map对每一个字符数组应用Arrays.stream函数,所以每一个字         //符串数组映射为一个字符串流。
        List<Stream<String>> collect1 = words.stream()
                .map(word -> word.split(""))
                .map(v -> Arrays.stream(v))
                .distinct()
                .collect(toList());
        //第一个map返回一个字符串流,流中的元素是一个个的字符串数组。
        //flatMap方法把流中的每个字符串数组都换成一个流,然后连接它们成        //为一个流
        List<String> 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() < 1000);
//是否所有元素都 不 匹配
boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000);

查找元素

findAny方法将返回当前流中的任意元素。

Optional<Dish> dish = menu.stream().filter(Dish::isVegetarian).findAny();

Optional是什么?

查找第一个元素

List<Integer> someNumbers = Arrays.asList(1, 2, 3, 2, 5);
//filter返回一个流,findfirst在该流中找第一个
Optional<Integer> 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,赶紧用起来吧。

原文地址:https://www.cnblogs.com/Mr-O-O/p/11768244.html

时间: 2024-11-08 04:39:21

Java Stream 流的使用的相关文章

一文带你入门Java Stream流,太强了

两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊.那就“勉为其难”写一篇吧,嘻嘻. 单从“Stream”这个单词上来看,它似乎和 java.io 包下的 InputStream 和 OutputStream 有些关系.实际上呢,没毛关系.Java 8 新增的 Stream 是为了解放程序员操作集合(Collection)时的生产力,之所以能解放,很大一部分原因可以归功于同时出现

Java Stream流式思想

说到Stream便容易想到I/O Stream,而实际上,谁规定“流”就一定是“IO流”呢?在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端. 引言 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们需要对集合中的元 素进行操作的时候,除了必需的添加.删除.获取外,最典型的就是集合遍历.例如: import java.util.List; impor

Java中的文件和stream流的操作代码

1.Java中FileRead方法的运用代码及详解 package example2;import java.io.FileReader;import java.io.IOException;class FileRead{    public static void main(String[] args) throws IOException{        //创建一个FileWriter对象    //FileWriter fw=new FileWriter("File01.txt"

关于Java8 Stream流的利与弊 Java初学者,大神勿喷

1:第一个队伍只要名字为3个字成员的姓名,存储到新集合 2:第一个队伍筛选之后只要前3人:存储到一个新集合 3:第2个队伍只要姓张的成员姓名:存储到一个新集合 4:第2个队伍不要前2人,存储到一个新集合 5:将2个队伍合并到一个队伍,存储到一个新集合 6:根据姓名创建Person对象,存储到一个新集合 //使用普通方法进行筛选 前面加了一个时间类 import java.util.ArrayList;public class Demo08List { public static void mai

java中的Stream流

java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端. 一.引言 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们需要对集合中的元 素进行操作的时候,除了必需的添加.删除.获取外,典型的就是集合遍历.

简洁方便的集合处理——Java 8 stream流

背景 java 8已经发行好几年了,前段时间java 12也已经问世,但平时的工作中,很多项目的环境还停留在java1.7中.而且java8的很多新特性都是革命性的,比如各种集合的优化.lambda表达式等,所以我们还是要去了解java8的魅力. 今天我们来学习java8的Stream,并不需要理论基础,直接可以上手去用. 我接触stream的原因,是我要搞一个用户收入消费的数据分析.起初的统计筛选分组都是打算用sql语言直接从mysql里得到结果来展现的.但在操作中我们发现这样频繁地访问数据库

Java学习:Stream流式思想

Stream流 Java 8 API添加了一种新的机制——Stream(流).Stream和IO流不是一回事. 流式思想:像生产流水线一样,一个操作接一个操作. 使用Stream流的步骤:数据源→转换成流→操作1→操作2→…… 数据源(source):可以是集合.数组等. Stream操作有两个基础特征: Pipelining(流水线):流操作会返回流对象(新的对象),以便后续继续进行流操作. 内部迭代:不需要像for循环或Iterator一样进行显式的迭代. 遍历及过滤集合中的元素 使用传统方

Java 之 Stream 流

Stream流 在Java 8中,得益于Lambda所带来的函数式编程,引入了一个全新的Stream概念,用于解决已有集合类库既有的弊端 一.传统遍历 1.传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作.而当我们需要对集合中的元素进行操作的时候,除了必需的添加.删除.获取外,最典型的就是集合遍历.例如: 1 import java.util.ArrayList; 2 import java.util.List; 3 4 pub

Java Stream函数式编程第三篇:管道流结果处理

一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之前,我觉得仍然需要给一些新朋友介绍一下这三个阶段,如图: 第一阶段(图中蓝色):将集合.数组.或行文本文件转换为java Stream管道流 第二阶段(图中虚线部分):管道流式数据处理操作,处理管道中的每一个元素.上一个管道中的输出元素作为下一个管道的输入元素. 第三阶段(图中绿色):管道流结果处理操