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 ...
随机推荐
- 如何优化MySQL
1.MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率.b. 选择合适的表字段数据类型和存储 ...
- mysql-单行处理函数
1 单行处理函数 lower() 对于输出转换成小写 upper()对于输出转换成大写 substr()取子字符串 下标从1开始 length() 去长度 concat()将字符串进行拼接 例:将首字 ...
- nios flash programer固化后不能运行
针对我的这个工程D:\works\FROM_COMP\8050\software\FPGA\MC8050_EP4CE15,出现的问题是nios eds 运行正常,有打印输出,有LED闪烁.但是flas ...
- ESP32 IDF V5.0 编译环境
方法:环境搭建工具一键安装: 下载链接:https://dl.espressif.com/dl/esp-idf/ 可以选择离线安装方式和在线安装方式,建议:采用离线安装的方式 下载离线安装包之后点击安 ...
- Static详细讲解
Static详细讲解 package com.andy.base.oop.demo01.demo07; import sun.dc.path.PathError; public class Perso ...
- 验证码案例的实现---MyBatis+Session+Cookie
展示验证码(jsp页面) 首先,我们需要自己利用BufferedImage类去生成一张可以变换的验证码图片: 之后,我们就可以利用这样一串代码去将验证码里面的内容获取到: 这是一串测试代码: Outp ...
- nat是干什么的,为什么要有nat?以及谈谈ovs里使用ct实现nat功能
博客竟然不显示更新的时间,只有个发布时间.看起来像2个月没更新一样,其实更新了几行呢.好几个东西想理一下,本来想和周记放一起了,但放一起就没有主题了. 当然一搜也有一些很好的博客,更详细:https: ...
- 开源不易、安全慎行,中国软件如何走向文明?丨RTE 技术环境月报 202205
各位开发者小伙伴: 这里是 2022 年第 5 期的 RTE<技术环境月报>--致力于成为对大家"有用"的 Highlight 看板--每月初通过 RTC 开发者社区( ...
- DVWA-SQL Injection(SQL注入)
SQL Injection,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的.结构,从而达到执行恶意SQL语句的目的. LOW: 代码审计: SQL Injection Source vuln ...
- Java:数据表的字段设计了默认值0不生效的原因
在数据表里给字段设置了默认值为0,但是在插入的时候不生效,数据表设计如下 通过数据表生成的实体类 查看代码 @Data @TableName(value = "user") @No ...