一、开篇

  1. Stream?其实就是处理集合的一种形式,称之为流,在Java8中被引入,可被Collection中的子类调用。
  2. 作用?简化代码,提升你的开发效率。
  3. 不会?看完这篇你就能自己上手了!

二、实例

首先将你的集合处理成流,才可以使用此API。

Stream<String> stream = list.stream();

接下来创建一个String类型的List,便于测试。

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(7);
list.add(4);
list.add(6);

接下来展示具体参数使用方式。

  • filter 过滤

例:需要过滤出在集合中,大于5的数字的集合。

List<Integer> result = list.stream().filter(o -> o>5).collect(Collectors.toList());

filter内部使用的是lamda表达式,也是Java8的功能,o代表集合中每一个元素,o>5表示这个元素的值若大于5就返回true,就获取结果。collect表示聚合,Collectors.toList()表示将结果聚合到一个List集合。

  • map 形成一个新对象

例:需要将集合内的元素全部转换成String类型。

List<String> result = list.stream().map(o->String.valueOf(o)).collect(Collectors.toList());
  • sort 排序

例: 需要从小到大排序。

List<Integer> result = list.stream().sorted().collect(Collectors.toList());

例: 需要从大到小排序。

List<Integer> result = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
  • forEach 遍历

例: 打印集合内每个元素。

list.stream().forEach(o->System.out.println(o));
list.forEach(o->System.out.println(o));
  • distinct 去除重复元素
List<Integer> result = list.stream().distinct().collect(Collectors.toList());
  • reduce 集合内运算

例: 计算集合中元素的和。

Integer sum = list.stream().reduce(0, (i, j) -> i + j);

reduce中第一个参数为基数,即为初始值,i,j的定义为第一个和第二个操作数,i+j即为操作,此处为加法操作。

如果计算乘法,就不能设置初始值为0,因为0乘任何数都为0。

  • collect 聚合成Collection
  1. Collectors.toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper)
  2. Collectors.toList()
  3. Collectors.toSet()
  4. ...

例: 将list聚合成一个key为元素,value为“item”+元素的Map。

Map<Integer, String> map = list.stream().collect(Collectors.toMap(Function.identity(), o -> String.format("item%s", o)));

结果:{1=item1, 2=item2, 3=item3, 4=item4, 6=item6, 7=item7}

keyMapper表示设置为key的规则,valueMapper表示设置为value的规则。

Function.identity()表示当前本身元素。

  • groupBy 分组

Collectors.groupingBy(Function<? super T, ? extends K> classifier)

新建一个User实体,有姓名和年龄两个字段,并初始化一个集合便于测试。

List<User> list = new ArrayList<User>();
list.add(new User("与李", 18));
list.add(new User("CSDN", 19));
list.add(new User("han", 20));
list.add(new User("han", 21));

例: 需要把名字相同的实体提出来放在一起,形成一个List集合。

Map<String, List<User>> group = list.stream().collect(Collectors.groupingBy(User::getName));

结果:{han=[User [name=han, age=20], User [name=han, age=21]], CSDN=[User [name=CSDN, age=19]], 与李=[User [name=与李, age=18]]}

此处使用User实体的name属性进行分组。

User::getName 与 o -> o.getName() 含义相同,两者皆可传入。

  • partitioningBy 分区

Collectors.partitioningBy(Predicate<? super T> predicate)

例: 分别统计年龄大于等于20和小于20的学生信息

Map<Boolean, List<User>> partitioning = list.stream().collect(Collectors.partitioningBy(o -> o.getAge() >= 20));

结果:{false=[User [name=与李, age=18], User [name=CSDN, age=19]], true=[User [name=han, age=20], User [name=han, age=21]]}

可以看到返回结果是一个Map<Boolean, List>,利用partitioningBy后生成的map,有且仅有两个元素,key固定为true和false,分别表示满足条件的信息和不不满足条件的信息。

三、结尾

此文列举了Stream部分方法的使用,具体更多的方法需要自己去深入了解。通过熟悉使用Stream的api之后,你会对它的处理方式爱不释手。

Java 8 Stream API实例的更多相关文章

  1. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  2. Java 8 Stream API

    Java 8 Stream API JDK8 中有两大最为重要的改变.第一个是 Lambda 式:另外 Stream API(java.util.stream.*) Stream 是 JDK8 中处理 ...

  3. Java 8 Stream API具体解释

    Java 8 Stream API具体解释 一.Stream API介绍 Java 8引入了全新的Stream API,此Stream与Java I/O包里的InputStream和OutputStr ...

  4. Java 8 Stream API Example Tutorial

    Stream API Overview Before we look into Java 8 Stream API Examples, let’s see why it was required. S ...

  5. Java 8 Stream Api 中的 peek 操作

    1. 前言 我在Java8 Stream API 详细使用指南[1] 中讲述了 [Java 8 Stream API]( "Java 8 Stream API") 中 map 操作 ...

  6. Java 8 Stream API的使用示例

    前言 Java Stream API借助于Lambda表达式,为Collection操作提供了一个新的选择.如果使用得当,可以极大地提高编程效率和代码可读性. 本文将介绍Stream API包含的方法 ...

  7. Java 8 Stream API 详解

    Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggregate operation),或者大批量数据操作 (b ...

  8. Java 使用 Stream API 筛选 List

    前言 上课的时候看到老师用迭代器来遍历 List 中的元素的时候,我的内心是极其嫌弃的,这种迭代方法不能直接访问当前的元素,而且写起来也麻烦.于是上网查了查 Java 有没有类似于 Linq 的东西, ...

  9. Spring WebFlux 学习笔记 - (一) 前传:学习Java 8 Stream Api (3) - Stream的终端操作

    Stream API Java8中有两大最为重要的改变:第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*). Stream 是 Java8 中处 ...

随机推荐

  1. MarkDown总结(适合初学者快速入门)

    本文转自https://blog.csdn.net/sun8112133/article/details/79871702 总得的来说,MarkDown是一种简单.轻量级的标记语法,它是基于HTML之 ...

  2. java实现一个简单的爬虫小程序

    前言 前些天无意间在百度搜索了一下以前写过的博客 我啥时候在这么多不知名的网站上发表博客了???点进去一看, 内容一模一样,作者却不是我... 然后又去搜了其他篇博客,果然,基本上每篇都在别的网站上有 ...

  3. day6 函数

    1.关键字参数     给实参对应的形参   调用函数时 设置关键字参数,形参=实参,把实参固定给那个形参 2.元组的可变(不定长参数)的使用      可变参数可以接收任意数量的普通的形参,并且组包 ...

  4. 30分钟闲置服务器建站(gitlab为例)

    前言 最近博主的阿里云主机又到了续费的时候了,刚买云主机的时候那是各种优惠各种打折,续费的时候只能当孙子了. 为了节省开支,又保证高性能的前提下,买了台10代NUC,内存和ssd自选,搭建一台个人服务 ...

  5. SpringBoot --- 自定义 Starter

    SpringBoot --- 自定义 Starter 创建 1.需要创建一个新的空工程 2.新的工程需要引入两个模块 一个Maven 模块 作为启动器 一个SpringBoot 模块 作为自动配置模块 ...

  6. PAT 2-07. 素因子分解(20)

    题目链接:http://www.patest.cn/contests/ds/2-08 题目意思:long int范围内的正整数N进行素因子分解. 直接整除即可,不需要素数筛选 代码如下: #inclu ...

  7. JAVA设计模式简介及六种常见设计模式详解

    一.什么是设计模式                                                                                           ...

  8. fdisk时WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.

    现象:划分磁盘有警告, fdisk可以看到 lsblk却没有 partprobe刷新分区还是不行 放大招 #reboot   #这个是最好的方法(重启后新的分区表不一定生效) 或 # partx -a ...

  9. 结对项目:四则运算(C语言)

    github地址:https://github.com/nilonger/arithmetic 结对伙伴:杨锐龙+黄海钊 一.项目要求 1.1 题目:实现一个自动生成小学四则运算题目的命令行程序(也可 ...

  10. arduino智能循迹小车代码(三个循迹模块)

    #include <Servo.h>int leftMotor1 = 3;int leftMotor2 = 5;int rightMotor1 = 6;int rightMotor2 = ...