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),单向,不可往复,数据只能遍历一次,遍历过一次后就用尽了. 一. ...
随机推荐
- 关于anaconda-navigator打不开的问题
19-10版本的anaconda-navigator打不开,没有图形化界面就是很糟糕 在命令行执行各种命令都没有问题,说明anaconda并没有出现大的问题,可能只是图形化界面出了问题. 执行 ana ...
- EF Expression 扩展
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; na ...
- Django 字段中 null 和 blank的区别
blank 设置为 True 时,字段可以为空 设置为 False 时,字段是必须填写的 默认为 False null 设置为 True 时,数据库的字段允许为NULL,而且表单中的空值将会被存储为N ...
- ASP.NET(C#) Json序列化反序列化帮助类Jsonhelper
原文地址:https://ken.io/note/csharp-asp.net-jsonhelper using System; using System.Collections.Generic; u ...
- Vue 使用MD5 加密
第一步: npm安装: npm install --save js-md5 第二步: 全局引用 import md5 from 'js-md5'; Vue.prototype.$md5 = md5; ...
- 通过python调用jenkins 常用api操作
# -*- coding: utf-8 -*- import jenkins class TestJenkins(object): def __new__(cls, *args, **kwargs): ...
- 02-14Android学习进度报告十四
今天我学习了关于构建一个可复用的自定义BaseAdapter的知识. 首先将Entity设置成泛型 代码示例: public class MyAdapter<T> extends Base ...
- thymeleaf模板引擎简介
一:thymeleaf 学习笔记---http://www.blogjava.net/bjwulin/articles/395185.html thymeleaf是一个支持html原型的自然引擎,它在 ...
- 5G新时代开启,你会选择哪家运营商?
牌照正式发放后,5G新时代正式来临.而5G时代显然开了个好头,B站UP主"老师好我叫何同学"发布的<有多快?5G在日常使用中的真实体验>视频,引爆全网.除了仅在B站就获 ...
- Nginx实现HTTP及TCP负载均衡
这种通过一台apache的服务器把客户请求分别传递给两台tomcat叫负载均衡 ========================================= ================= ...