Java8Stream流
2024-09-08 17:27:41
Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多。但总感觉自己学的一知半解,所以今天打算系统的过一下,再巩固巩固。
概念
Stream是JDK8 API中的新成员,它允许以声明性方式处理集合。
流程
1、把集合转换为流Stream
2、操作Stream流
Stream流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果
一些常见的中间操作和中止操作
- 中间操作(过滤、映射、限制...),可以多个
方法名 | 方法作用 | 返回值类型 | 方法类型 |
---|---|---|---|
filter | 过滤 | Stream | 中间操作 |
map | 映射(转换)接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素 | Stream | 中间操作 |
peek | 窥探 | Stream | 中间操作 |
skip | 跳过前几个 | Stream | 中间操作 |
limit | 截取前几个 | Stream | 中间操作 |
distinct | 去重操作(比较的是地址) | Stream | 中间操作 |
sorted | 排序操作 | Stream | 中间操作 |
- 终止操作(最常见的是收集),只可以设置1个
方法名 | 方法作用 | 返回值类型 | 方法类型 |
---|---|---|---|
collect | 收集处理结果 | 泛型 | 终止操作 |
count | 统计个数 | long | 终止操作 |
forEach | 逐一处理 | void | 终止操作 |
reduce | 汇总操作 | Optional<> 该对象有get方法可以获取返回值 | 终止操作 |
Stream的3个注意事项:
- Stream中间操作方法返回的是新的流
- Stream不调用终结方法,中间的操作不会执行
- Stream只能调用一次终止操作。得到结果后,不能再次使用这个流。
下面是一些小demo
点击查看代码
/**
* 过滤集合中不符合条件的元素
*/
@Test
public void testfilter(){
List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl");
List<String> aList = stringList.stream().filter(str -> str.contains("a")).collect(Collectors.toList());
aList.forEach(System.err::println);
}
/**
*去重
*/
@Test
public void testDistinct(){
List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
List<String> distinctStr = stringList.stream().distinct().collect(Collectors.toList());
distinctStr.forEach(System.out::println);
//--------------------------------
Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食");
Product prod2 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
Product prod3 = new Product(2L, 2, new BigDecimal("20"), "饼干", "零食");
ArrayList<Product> proList = Lists.newArrayList(prod1, prod2, prod3);
List<Product> distinctProList = proList.stream().distinct().collect(Collectors.toList());
distinctProList.forEach(System.out::println);
}
/**
* limit(n)获取流中的前n个元素
*/
@Test
public void testLimit(){
List<String> stringList = Arrays.asList("abc", "", "bc", "def", "abcd", "", "jkl","jkl");
List<String> limitStr = stringList.stream().limit(3).collect(Collectors.toList());
System.out.println(limitStr);
}
/**
* skip(n)
*/
@Test
public void testSkip(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<String> skipStrList = stringList.stream().skip(2).collect(Collectors.toList());
System.out.println(skipStrList);
}
/**
* map() 接收一个函数作为参数,这个函数会被应用到每个元素上,并将其映射成为一个新的元素
*/
@Test
public void testMap(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<String> mapStrList = stringList.stream().map(str -> str.concat("_map")).collect(Collectors.toList());
System.out.println(mapStrList);
}
@Test
public void testSorted(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
List<String> sortedStrList = stringList.stream().sorted().collect(Collectors.toList());
System.out.println(sortedStrList);
}
/**
* collect():将流转换为其他形式 list set map
*/
@Test
public void testCollect(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
Set<String> collectSet = stringList.stream().collect(Collectors.toSet());
System.out.println(collectSet);
}
/**
* 将流中元素反复结合起来得到一个结果
*/
@Test
public void testReduce(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
Optional<String> reduce = stringList.stream().reduce((acc, item) -> {return acc + item;});
if (reduce.isPresent()) System.out.println(reduce.get());
}
/**
* 将流中元素反复结合起来得到一个结果
*/
@Test
public void testCount(){
List<String> stringList = Arrays.asList("abc", "", "bcd", "def", "abcd", "", "jkl","jkl");
long count = stringList.stream().count();
System.out.println(count);
}
最新文章
- xml---sax操作
- putty如何使用
- bzoj3745: [Coci2015]Norma
- javascript中parentNode,childNodes,children的应用详解
- core java 1~4(HelloWorld &; 标识符|关键字|数据类型 &; 表达式|流程控制 &; 数组)
- SQL数据库语句
- [jdoj1817]Drainage Ditches_网络流
- SpriteBuilder添加的TrueType字体未显示在log中的原因分析
- 元数据Metadata
- Docker:容器的四种网络类型 [十三]
- C# winform使用combobox遍历文件夹内所有文件
- 在MyEclipse使用Git新建分支,并上传分支---图文教程
- Properties读取properties配置文件
- TagCanvas 插件
- java中存在三种调用机制
- java 期末考试复习
- 把pandas dataframe转为list方法
- WebService远程调用技术
- extJS 动态引用加载(转)
- git查看添加删除远程仓库
热门文章
- Python基础部分:12、文件光标移动(补充)
- 【Virt.Contest】CF1155(div.2)
- mindxdl--common--errs.go
- 学习ASP.NET Core Blazor编程系列十四——修改
- 关于linux fcitx输入法候选词中含有省略号的问题解决
- 【SQL知识】SQL中的join操作总结:内连接、外连接(左右全)
- 【Java SE进阶】Day12 函数式接口、函数式编程(Lambda表达式)
- 【大数据面试】【数仓项目】分层:ODS层、DWD层、DWS层、ADS层构成、操作
- CountDownLatch闭锁源码解析(基于jdk11)
- Redis——02 学习