说明

集合和数组是我们经常会用到的数据结构,在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优雅地处理集合的更多相关文章

  1. Java8 使用 stream().sorted()对List集合进行排序

    集合对像定义 集合对象以学生类(StudentInfo)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项. 使用stream().sorted()进行排序,需要该类实现 Comparab ...

  2. Java 8 新特性-Stream更优雅的处理集合入门

    Java 8 新特性之--Stream 一. 简单介绍 Stream是Java 8提出了的一种新的对集合对象功能的增强.它集合Lambda表达式,对集合提供了一些非常便利,高效的操作,使得代码具有非常 ...

  3. Java8的Stream语法详解(转载)

    1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...

  4. Java8的Stream API使用

    前言 这次想介绍一下Java Stream的API使用,最近在做一个新的项目,然后终于可以从老项目的祖传代码坑里跳出来了.项目用公司自己的框架搭建完成后,我就想着把JDK版本也升级一下吧(之前的项目, ...

  5. java8新特性:对map集合排序

    一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map,map是键值对的集合接口,它的实现类主要包括:HashMap, TreeMap, Hashtable以及LinkedHashMap等 ...

  6. Java8之Stream详解

    Java8中提供了Stream对集合操作作出了极大的简化,学习了Stream之后,我们以后不用使用for循环就能对集合作出很好的操作.   一.流的初始化与转换   Java中的Stream的所有操作 ...

  7. Java 8 中如何优雅的处理集合

    Java 8 中如何优雅的处理集合(Stream API) 在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增.删.改.查.聚合.统计.过滤等操作.相比之下,关系型数据库中也同样有 ...

  8. java8之Stream流处理

    简介 Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念. Stream 机制是针对集合迭代器 ...

  9. java8的stream功能及常用方法

    Java8中stream对集合操作做了简化,用stream操作集合能极大程度简化代码.Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后就用尽了. 一. ...

随机推荐

  1. Java 中 CAS

    一.CAS 概念 CAS ,全称 Compare And Swap(比较与交换),解决多线程并行情况下使用锁造成性能损耗的一种机制. 实现思想 CAS(V.A.B) ,V为内存地址,A为预期原值,B ...

  2. Laravel Vuejs 实战:开发知乎 (4)实现找回密码

    资料 : Resetting Passwords   以及 Episode 35 - The Password Reset Flow 由于之前的实现里默认自带重置找回密码功能,不再复述. 默认的重置页 ...

  3. Python解决RSA加密

    最近爬个网站需要用发现密码是通过RSA加密的,因此找网上python加密例子,发现都没有一个比较完整的demo so,自己写一个吧~ 首先,安装相应的库: 1. pyCrypto : pip inst ...

  4. 使用SSH客户端远程登录Linux主机

    使用SSH客户端远程登录Linux主机(可替代samba.ftp服务) . Linux系统起初就是为多用户而产生的,可以允许多个用户同时登录linux主机各自进行操作,如图1所示: 图1 SSH(Se ...

  5. 「JSOI2015」送礼物

    「JSOI2015」送礼物 传送门 看到这题首先想到分数规划. 我们发现对于当前区间,如果它的最大值和最小值不是分居区间的两个端点的话,那么我们显然可以把两端多出去的部分舍掉,因为,在区间最大值最小值 ...

  6. 安卓开发:初步了解布局文件layout

    了解完项目的目录结构,主要文件的作用之后. 了解完各常量文件的定义和使用之后,接下来的重头戏肯定是布局文件layout. 果然,网上关于“安卓布局文件layout”的各种介绍.解析.深入分析,等等资料 ...

  7. C:sizeof 运算符

    sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节 sizeof的返回值为size_t size_t类型在32位操作系统下是unsigned int,是一个无 ...

  8. Bugku-CTF加密篇之简单加密(e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA)

    简单加密   e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA    

  9. Spring Boot Web 开发@Controller @RestController 使用教程

    在 Spring Boot 中,@Controller 注解是专门用于处理 Http 请求处理的,是以 MVC 为核心的设计思想的控制层.@RestController 则是 @Controller ...

  10. 洛谷P1073最优贸易(跑两遍dij)

    题目描述 CC C国有n n n个大城市和m mm 条道路,每条道路连接这 nnn个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 mmm 条道路中有一部分为单向通行的道路,一部分为 ...