公司内部服务就不记录在博客中了
Java8 Stream
Stream流是一个来自数据源的元素队列并支持聚合操作
- Java的Stream并不会存储元素,而是按需计算
- 数据源流的来源,可以是集合,数据,I/0Channel,产生器等generator等
- 聚合操作类似SQL语句一样的操作,比如filter,map,reduce,find,match,sorted等
- Pipelining:中间操作都会返回流对象本身,这样多个操作可以串联成一个管道,如同流式风格,这样u做可以对操作进行优化,比如延迟执行和短路
- 内部迭代:以前对集合遍历都是通过iterator或者For-Each的方式,显式的在集合外部进行迭代,这叫做外部迭代,Stream提供了内部迭代的方式,通过访问者模式实现
在Java8中,集合接口有两个方法来生成流
stream:为集合创建流
parallelStream:为集合创建并行流
流处理的特性
- 不存储数据
- 不会改变数据源
- 不可以重复使用
操作案例
源数据经管道,最后输出结果数据
Stream执行顺序示意图
执行顺序会走之字形
stream流的中间操作API
中间操作符在执行指定处理程序后,数据流依然可以传递给下一级的操作符
方法 | 说明 |
---|---|
filter | 过滤操作将不要的数据过滤掉 |
map | 转换操作,有mapToInt(),mapTODouble(),mapToLong()方法,有点类似于类型转换 |
flatMap | 平铺操作,也是将一些数据展开,比如把int[]{2,3,4} 展开变成2,3,4 |
limit | 限流操作,比如数据流中有10个,只要前3个就可以使用 |
distinct | 去重操作,对重复元素去重,底层使用了equals方法 |
peek | 挑出操作,如果想对数据进行某些操作,如:读取,编辑修改等 |
skip | 跳过操作,跳过某些元素不做处理 |
sorted | 排序操作,对元素排序,前提是实现Comparable接口 |
Stream流的终止操作API
数据经过加工操作,就轮到终止操作符,终止操作符用来对数据进行收集或者消费的,数据到了终止操作这里就不会向下流动了,终止操作符只能使用一次
方法 | 说明 |
---|---|
collect | 收集操作,将所有数据收集起来,这个操作非常重要,官方的提供的Collectors 提供了非常多收集器,可以说Stream 的核心在于Collectors |
count | 统计操作 |
findFirst | 查找第一个匹配的元素 |
findAny | 查找任何一个匹配的元素 |
noneMatch | |
allMatch | 三个Match用来匹配数据流中是否有符合条件的元素,返回boolean值 |
anyMatch | |
max,min,sum | 求最大值,最小值,求和操作 |
reduce | 规约操作,将整个数据流的值规约为一个值,count,min,max底层就是使用reduce |
forEach | forEach,forEachOrdered遍历操作 |
toArray | 数组操作,将数据流的元素转换成数组 |
filter过滤
List<Student> collect = data.stream()
.filter(student -> "woman".equals(student.getSex())).collect(Collectors.toList());
System.out.println(collect);
map类型映射
List<String> collect1 = data.stream().map(student -> student.getName()).collect(Collectors.toList());
System.out.println(collect1);
distinct去重操作
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
list.add("pear");
list.add("dog");
list.add("cat");
list.add("apple");
list.add("apple");
list.add("apple");
List<String> collect2 = list.stream().distinct().collect(Collectors.toList());
System.out.println(collect2);
flatMap平铺数据元素
List<String> teamIndia = Arrays.asList("Virat", "Dhoni", "Jadeja");
List<String> teamAustralia = Arrays.asList("Warner", "Watson", "Smith");
List<String> teamEngland = Arrays.asList("Alex", "Bell", "Broad");
List<String> teamNewZeland = Arrays.asList("Kane", "Nathan", "Vettori");
List<String> teamSouthAfrica = Arrays.asList("AB", "Amla", "Faf");
List<String> teamWestIndies = Arrays.asList("Sammy", "Gayle", "Narine");
List<String> teamSriLanka = Arrays.asList("Mahela", "Sanga", "Dilshan");
List<String> teamPakistan = Arrays.asList("Misbah", "Afridi", "Shehzad");
List<List<String>> playersInWorldCup2016 = new ArrayList<>();
playersInWorldCup2016.add(teamIndia);
playersInWorldCup2016.add(teamAustralia);
playersInWorldCup2016.add(teamEngland);
playersInWorldCup2016.add(teamNewZeland);
playersInWorldCup2016.add(teamSouthAfrica);
playersInWorldCup2016.add(teamWestIndies);
playersInWorldCup2016.add(teamSriLanka);
playersInWorldCup2016.add(teamPakistan);
System.out.println(playersInWorldCup2016);
skip跳过元素
List<String> list1 = new ArrayList<>();
list1.add("apple");
list1.add("banana");
list1.add("orange");
list1.add("pear");
list1.add("dog");
list1.add("cat");
list1.add("apple");
list1.add("apple");
List collect3 = list1.stream().skip(4).collect(Collectors.toList());
System.out.println(collect);
limit获取n个元素
List<String> collect = list.stream().limit(4).collect(Collectors##### min,max,sum求值
##### forEach遍历.toList());
System.out.println(collect);
sorted排序
List<Person> list = new ArrayList<>();
Person p1 = new Person(1,"xiaoming","man",23);
Person p2 = new Person(2,"xiaohong","woman",27);
Person p3 = new Person(1,"xiaolei","man",24);
Person p4 = new Person(1,"xiaoli","man",26);
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
List<Person> collect = list.stream().sorted().collect(Collectors.toList());
或者直接在sorted方法里给定参数
List<Person> collect = list.stream()
.sorted((Comparator.comparingInt(Person::getAge)))
.collect(Collectors.toList());
peek处理元素内数据
List<Person> collect = list.stream().peek(person -> System.out.println("[person]=" + person)).collect(Collectors.toList());
count统计
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
list.add("pear");
list.add("dog");
list.add("cat");
list.add("apple");
list.add("apple");
list.add("apple");
long apple = list.stream().filter(s -> "apple".equals(s)).count();
// 另外上面还可以替换为
long apple = list.stream().filter("apple"::equals).count();
System.out.println(apple);
Snappy压缩
因为项目中用的很简单这里就不多作阐述了
详情可见API文档:https://github.com/xerial/snappy-java
用法
导包
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.1.2.4</version>
</dependency>
代码
public byte[] snappyCompress(byte[] data) throws Exception {
return Snappy.compress(data);
}
/**
* 使用Snappy.uncompress进行解压缩
* @param data
* @return byte[]
* @create 2020/3/11 16:38
*/
public byte[] snappyDecompress(byte[] data) throws Exception {
return Snappy.uncompress(data);
}