Stream方法的介绍
文章目录
前言
最近在学习Stream流,写项目时用到了一些map, filter方法,就想着去学习一下,于是就有了下面这篇文章,下面分享了一些常见的方法和介绍…
Lambda表达式
Lambda表达式是Java8之后才有的写法,Lambda表达式基于数学中的 λ演算 得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 Lambda表达式可以表示 闭包 (注意和数学传统意义上的不同。
格式
lambda表达式可以看成一个匿名的方法,写法更加简洁,可以省略修饰符、返回类型、throws语句。一般看到的形式:(参数) -> 表达式,包含一个参数列表和一个lambda体,二者之间通过一个函数箭头“->''分隔。
(i,j) -> i*j
函数式接口
函数式接口有且只有一个抽象方法的接口,确保接口中仅有一个抽象方法
下面来看个简单的例子:
- 首先定义一个接口
public interface Man {
void speak();
}
- 定义一个类实现这个接口,并重写这个方法
public class Dy implements Man{
@Override
public void speak() {
System.out.println("我是男的");
}
}
- 在主类中调用,这样是不是可以正常打印
public static void main(String[] args) {
test( () -> {
System.out.println("我是个男生");
});
}
public static void test(Man man) {
man.speak();
}
Lambda表达式一定是接口,并且是可以通过上下文来推导出Lambda表达式的接口的。
Stream的方法介绍
stream是位于java.util.stream包,包下面后很多的好用的方法,比如我们很常用的Collectors,Stream等等
获取一个Stream的方法有of
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
forEach
我们可以自己获取一个Stream,然后再一个forEach来遍历
Stream<String> words = Stream.of("flink", "Spark", "storm", "MapReduce");
words.forEach(item -> System.out.println(item));
filter
我们可以使用filter来过滤stream中的数据
List<Integer> list = new LinkedList<>();
list.add(1);
list.add(1);
list.add(1);
list.add(1);
list.add(1);
list.add(2);
list.add(3);
Stream<Integer> stream = list.stream().filter(item ->
item > 1
);
collect
在过滤好之后,我们一般在写一些业务逻辑时会将这个流保存起来
List<Integer> collect1 = list.stream().filter(item ->
item > 1
).collect(Collectors.toList());
count
我们用count来统计数量,这里count返回的是一个long
long count = list.stream().filter(item ->
item > 1
).count();
sum
有了count计数,当然我们也可以使用sum来进行求和了,但是在进行求和前我们需要将数据使用一个mapToInt将我们的数据先映射到我们需要的数据类型上,原生的有mapToInt, mapToDouble, mapToLong, toIntFunction, toLongFunction, ToDoubleFunction
list.stream().mapToInt(Integer::intValue)
.sum();
limit 和skip
获取前n条数据,一般我们处理的都是有序流,如果是无序流的话,这两个都可以说是随机取了
// 获取前两个
Stream<User> limitUserStream = userList.stream().sorted(Comparator.comparing(User::getId))
.limit(2);
//除去前两个
userList.stream().sorted(Comparator.comparing(User::getId))
.skip(2);
groupingBy
我们可以通过某个类进行分类,这个programLanguageList是一个对象的列表,我们根据编程语言进行了一个分类,然后就可以打印出我们需要的结果
Map<String, Long> programMap = programLanguageList.stream()
.collect(Collectors.groupingBy(ProgramLanguage::getLanguage,
Collectors.counting()));
System.out.println(programMap.toString());

当需要对一个Map类型进行收集的时候,我们可以通过Map.Entry来遍历,然后再通过mapping来觉得收集成什么样的数据
Map<String, String> map = new HashMap<>(4);
map.put("java", "基础语法");
map.put("java", "Spring Boot");
map.put("c++", "算法竞赛入门经典");
map.put("c++", "c++ plus");
Map<String, Set<String>> collectMap = map.entrySet().stream()
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, toSet())));
System.out.println(collectMap.toString());

reduce
我们通过reduce来对数据进行一些聚合操作
Integer reduce = list.stream().reduce(0, (a, b) -> a + b);
System.out.println("reduce:" + reduce);
总结
上述是一些常见的Stream的方法,还有一些其他的方法,但是我没有去列出来,相信大家多用用就会了。
Stream方法的介绍的更多相关文章
- Java8的Stream方法findAny空指针异常(NullPointerException)实例对比
实战介绍 学习完Java8的Stream方法,可能你正准备大展身手,却发现遇到不少问题,本篇文章为大家带来一个findAny方法抛出java.lang.NullPointerException的场景. ...
- KEGG数据库的使用方法与介绍
KEGG数据库的使用方法与介绍 KEGG的数据 KEGG中的pathway是根据相关知识手绘的,这里的手绘的意思可能是指人工以特定的语言格式来确定通路各组件的联系:基因组信息主要是从NCBI等数据库中 ...
- php常用Stream函数集介绍
php常用Stream函数集介绍 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-24 本篇文章是对php中的常用Stream函数集进行了详细的分析介绍,需要的朋友参考下 ...
- 使用Memcache在PHP中调试方法的介绍及应用
使用Memcache在PHP中调试方法的介绍及应用 如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce.首先我们必须要安装,接 ...
- InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。
InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是 ...
- 04-vi使用方法详细介绍
vi使用方法详细介绍 vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版 ...
- WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍
这篇文章主要介绍了WQL语言简介和WQL测试工具wbemtest.exe使用方法详细介绍,WQL是指Windows管理规范查询语言,需要的朋友可以参考下 WQL就是WMI中的查询语言,WQL的全称是W ...
- Python3.x:os.chdir(改变当前路径方法)介绍
Python3.x:os.chdir(改变当前路径方法)介绍 1,os.chdir() import os os.chdir(r'C:\python36\test_chdir') 说明:chdir() ...
- js中propertyIsEnumerable()方法使用介绍
javascript的propertyIsEnumerable()方法使用介绍 概述 propertyIsEnumerable()用来检测属性是否属于某个对象的,如果检测到了,返回true,否则fal ...
- python模块之calendar方法详细介绍
calendar,是与日历相关的模块.calendar模块文件里定义了很多类型,主要有Calendar,TextCalendar以及HTMLCalendar类型.其中,Calendar是TextCal ...
随机推荐
- Deepin20安装pip3和Pydev插件
1. 安装jdk(见前面) 2. 安装eclipse(见前面) 3. Deepin20里已经有python3.7.3和python2.7.16,我们可以直接使用3.7.3,也是默认的python3.还 ...
- k8s探针
探针是由kubelet对容器执行的定期诊断.要执行诊断,kubelet调用由容器实现的Handler.有三类处理程序: ExecAction:在容器内执行指定命令.如果命令退出时返回码为0认为诊断成功 ...
- MySQL存储过程札记
DELIMITER // CREATE PROCEDURE GetAllProducts() BEGIN SELECT * FROM products; END //DELIMITER ; 第一个命令 ...
- 统一返回对象Result
统一返回对象Result 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致.轻松. 一般情况下,统一返回数据格式 ...
- PHP 错误设置
错误显示设置 设置:那些错误该显示,以及该如何显示 在PHP中,有两种方式来设置当前脚本的错误处理 1.PHP配置文件--php.ini 修改配合文件需要重启服务 display_error:是否显示 ...
- Javaweb学习笔记第七弹
Maven依赖范围 对于Maven的安装配置等环境准备问题,可详细参考我的前几篇博客, 网址1:https://www.cnblogs.com/liuzijin/p/16654344.html 网址2 ...
- Tars-Java网络编程源码分析
作者:vivo 互联网服务器团队- Jin Kai 本文从Java NIO网络编程的基础知识讲到了Tars框架使用NIO进行网络编程的源码分析. 一.Tars框架基本介绍 Tars是腾讯开源的支持多语 ...
- MyBatis缓存机制[NO]
前言 MyBatis是常见的Java数据库访问层框架.在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在 ...
- std常用类型
std::getline 文档 std::reverse 文档 注意事项 reverse()返回值为void,是对原序列进行修改 std::vector 文档 emplace 和 emplace_ba ...
- 使用 Solon Cloud 的 Jaeger 做请求链路跟踪
<dependency> <groupId>org.noear</groupId> <artifactId>jaeger-solon-cloud-plu ...