Java8使用Stream优雅地处理集合
说明
集合和数组是我们经常会用到的数据结构,在jdk1.8之前,集合和数组的处理并不是很便捷。但是到了JDK1.8之后,使用Stream处理集合会使代码变得更加的简洁明了。作为一名开发者,其实很有必要学习新特性的用法,即使是说项目中没有采用。虽然JDK1.8已经发布数年,但是还是发现很多人都不会使用JDK1.8给我们带来的新的API。比如之前写过的一篇文章还在用SimpleDateFormat?Java8都发布N年了,转LocalDateTime吧,讲解了JDK1.8时间上的新API,大家也可以看看。
Stream类的常用api
这里列举了比较常用的api,想要查看更加具体API,大家可以参考下jdk1.8官方文档,那里有更加详细的描述。
初始化
初始化一个Stream常用到两种方法:
方法一:List的stream()方法
@Test
public void listInit(){
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
Stream<String> stream = list.stream();
}
方法二:Stream.of()方法
@Test
public void streamOfInit(){
// 第一种
Stream<String> stream = Stream.of("a", "b", "c", "d");
// 第二种
String [] strings = {"a","b","c"};
Stream<String> stream1 = Stream.of(strings);
}
filter过滤
挑选需要的元素,比如:下方例子把dog字符串过滤掉
/**
* 过滤
*/
@Test
public void filter() {
String[] strings = {"apple", "banana", "cat", "dog"};
List<String> list = Stream.of(strings).filter(e -> !StringUtils.equals(e, "dog")).collect(Collectors.toList());
System.out.println(JSON.toJSONString(list));
}
输出结果:
["apple","banana","cat"]
map 生成新的集合
这里有两个类
@Data
@AllArgsConstructor
public static class Person {
private Integer id;
private String name;
}
@Data
public static class Man {
private Integer id;
private String name;
}
把一个List转化成List
@Test
public void map2() {
List<Person> list = new ArrayList<>();
list.add(new Person(1, "happyjava1"));
list.add(new Person(2, "happyjava2"));
List<Man> manList = list.stream().map(e -> {
Man man = new Man();
man.setId(e.getId());
man.setName(e.getName());
return man;
}).collect(Collectors.toList());
System.out.println(JSON.toJSONString(manList));
}
输出结果
[{"id":1,"name":"happyjava1"},{"id":2,"name":"happyjava2"}]
Collectors.toMap 把list拼接成需要的map
这个在向数据库查询list数据的时候经常用到
@Test
public void testCollectToMap() {
List<Person> list = new ArrayList<>();
list.add(new Person(1, "happyjava1"));
list.add(new Person(2, "happyjava2"));
Map<Integer, Person> personMap = list.stream().collect(Collectors.toMap(Person::getId, e -> e));
System.out.println(JSON.toJSONString(personMap));
Map<Integer, String> nameMap = list.stream().collect(Collectors.toMap(Person::getId, Person::getName));
System.out.println(JSON.toJSONString(nameMap));
}
输出结果
{1:{"id":1,"name":"happyjava1"},2:{"id":2,"name":"happyjava2"}}
{1:"happyjava1",2:"happyjava2"}
sort排序
无参的sort方法支持基本数据类型,包装类型,String等类型的自然顺序排序
@Test
public void sort() {
// 自然顺序排序 基本数据类型 字符串
List<String> collect = Stream.of("1", "5", "2", "9", "3", "4").sorted().collect(Collectors.toList());
System.out.println(JSON.toJSONString(collect));
List<Person> list = new ArrayList<>();
list.add(new Person(1, "happyjava1"));
list.add(new Person(2, "happyjava2"));
// 自然顺序排序
List<Person> personList = list.stream().sorted((o1, o2) -> {
if(o1.getId() > o2.getId()){
return 1;
} else if(o1.getId().equals(o2.getId())){
return 0;
} else {
return -1;
}
}).collect(Collectors.toList());
System.out.println(JSON.toJSONString(personList));
}
输出结果
["1","2","3","4","5","9"]
[{"id":1,"name":"happyjava1"},{"id":2,"name":"happyjava2"}]
skip和limit
这个相当于MySQL的limit n,m,与MongoDB的skip、limit用法是一致的。意思就是跨过几行记录,取几行记录的意思。
@Test
public void skipAndLimit(){
List<String> list = Stream.of("1", "5", "2", "9", "3", "4").skip(2).limit(3).collect(Collectors.toList());
System.out.println(JSON.toJSONString(list));
}
输出结果
["2","9","3"]
总结
常用的Stream操作都在这里列举了,当然Stream还有很多其他的用法,这里也没法一一列举,需要读者自己去学习。
Java8使用Stream优雅地处理集合的更多相关文章
- Java8 使用 stream().sorted()对List集合进行排序
集合对像定义 集合对象以学生类(StudentInfo)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项. 使用stream().sorted()进行排序,需要该类实现 Comparab ...
- Java 8 新特性-Stream更优雅的处理集合入门
Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...
- Java8的Stream语法详解(转载)
1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...
- Java8的Stream API使用
前言 这次想介绍一下Java Stream的API使用,最近在做一个新的项目,然后终于可以从老项目的祖传代码坑里跳出来了.项目用公司自己的框架搭建完成后,我就想着把JDK版本也升级一下吧(之前的项目, ...
- java8新特性:对map集合排序
一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...
- Java8之Stream详解
Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作. 一.流的初始化与转换 Java中的Stream的所有操作 ...
- Java 8 中如何优雅的处理集合
Java 8 中如何优雅的处理集合(Stream API) 在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有 ...
- java8之Stream流处理
简介 Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念. Stream 机制是针对集合迭代器 ...
- java8的stream功能及常用方法
Java8中stream对集合操作做了简化,用stream操作集合能极大程度简化代码.Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后就用尽了. 一. ...
随机推荐
- 记一次深坑,dubbo暴露的服务无法注册到zookeeper的原因
项目用的架构,springboot,dubbo,zookeeper dubbo的provider作为服务单独使用,里面的service实现类使用了@Transactional注解,想集成spring的 ...
- 安装多个xcode对homebrew影响
安装多个xcode,可能会导致无法识别默认使用哪个xcode的情况,这时候执行下列语句,设置默认xcode sudo xcode-select --switch /Applications/Xcode ...
- HBase的完全分布式搭建
一.HBase的安装模式 ①单机安装:不依赖于Hadoop的HDFS,配置完即可使用,好处是便于测试,坏处是不具备分布式数据存储的能力. ②伪分布式安装:单台主机模拟真实环境. ③完全分布式安装:多台 ...
- C语言:把分数最低的学生数据放入数组b所指的数组中,-从键盘输入若干字符串,写入文件myfile4中,用-1作字符输入结束的标志,
//学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,fun函数:把分数最低的学生数据放入数组b所指的数组中,分数最低的学生可能不止一个.人数返回. #include <st ...
- SVG和canvas的区别
1.Canvas 是用JavaScript 操作动态生成的, SVG 则是使用XML静态描述生成的; 2.Canvas 基于位图,简单来说就是图片放大会影响到显示的效果,造成不好的影响,SVG 基于矢 ...
- php7 Memcached
PHP7 Memcached 扩展 wget https://codeload.github.com/websupport-sk/pecl-memcache/zip/php7/pecl-memcach ...
- Euler Sums系列(三)
\[\Large\sum_{n=1}^{\infty}\frac{\left(H_{n}^{(2)}\right)^{2}}{n^{2}}=\frac{19}{24}\zeta(6)+\zeta^{2 ...
- JPA 级联保存的问题
前提:系统有学校-学生关系,学校可以包含多个学生,学生只能属于一个学校 在使用 spring-data-jpa 的时候,保存学校的同时保存学生信息,不需要先逐个保存学生信息,再将学生信息放在学校中保存 ...
- Pako.js压缩解压,vue压缩解压,前后端之间高效数据传输
项目开发中常常会遇到前后端之间有大量数据传输占用带宽导致页面响应慢的问题,这时候我们可以考虑使用Pako.js对信息进行压缩之后传输. 我在前端使用的是vue-element-admin前端框架.框架 ...
- OpenTSDB 写入数据
1. 关于 Metrics, value, tag name, tag value opentsdb的每个时间序列必须有一个metric和一个或多个tag对,每个时间序列每小时的数据保存一行.open ...