Stream实操
一、filter
/**
* filter:过滤不符合断言判断的数据
*/
@Test
public void filerTest(){
list.stream()
// 筛选书籍类的商品
.filter(sku ->
SkuCategoryEnum.BOOKS
.equals(sku.getSkuCategory()))
.forEach(sku ->
System.out.println(
JSON.toJSONString(sku, true)));
}
filter函数源码
Stream<T> filter(Predicate<? super T> predicate);
Predicate<? super T> predicate是一个断言函数式接口,里面有一个boolean test(T t);方法,使用lamda表达式传入对应的判断逻辑,根据返回boolean类型值来过滤。上述代码的过滤逻辑是:
// 是否为书记类的商品
sku ->SkuCategoryEnum.BOOKS.equals(sku.getSkuCategory())
二、map
/**
* map 将一种类型元素转换成另外一种类型元素
*/
@Test
public void mapTest() {
list.stream()
/*
map 将sku对象转换为skuName(String类型)
得到的结果将式skuName组成的集合
*/
.map(sku -> sku.getSkuName())
.forEach(sku ->
System.out.println(
JSON.toJSONString(sku, true)));
}
三、peek
对集合进行任意操作无返回值,通常用于输出集合内容,他是并行的,如果遇到有状态的流操作会顺序执行,例如sorted,否则将会交替执行。
@Test
public void peekTest() {
list.stream()
// peek 输出list中的sku的skuName
.peek(sku -> System.out.println(sku.getSkuName()))
.forEach(sku ->
System.out.println(
JSON.toJSONString(sku, true)));
}
4.sorted
排序,可以自定义比较规则,也可以默认,我们先来看一下默认排序规则用法
@Test
public void sortedTest() {
list.stream()
.peek(sku -> System.out.println(sku.getSkuName()))
// 根据sku的TotalPrice来进行排序,从小到大
.sorted(Comparator.comparing(Sku::getTotalPrice))
.forEach(sku ->
System.out.println(
JSON.toJSONString(sku, true)));
}
五、distinct
去除重复的字段,我们在做共同好友这样的功能时能够用到
@Test
public void distinctTest() {
list.stream()
.map(sku -> sku.getSkuCategory())
// 去重
.distinct()
.forEach(sku ->
System.out.println(
JSON.toJSONString(sku, true)));
}
六、skip
@Test
public void skipTest() {
list.stream()
.peek(sku -> System.out.println(sku.getSkuName()))
// 跳过前三条
.skip(3)
.forEach(sku ->
System.out.println(
JSON.toJSONString(sku, true)));
}
七、limit
@Test
public void limitTest() {
list.stream()
.peek(sku -> System.out.println(sku.getSkuName()))
// 只取前三条
.limit(3)
.forEach(sku ->
System.out.println(
JSON.toJSONString(sku, true)));
}
八、allMatch/anyMatch
@Test
public void allMatchTest() {
boolean flag = list.stream()
// 每个都满足条件
.allMatch(sku -> sku.getTotalPrice() > 100);
System.out.println(flag);
}
@Test
public void anyMatchTest(){
boolean flag = list.stream()
// 任意一个满足条件
.anyMatch(sku -> sku.getTotalPrice() > 100);
System.out.println(flag);
}
九、noneMatch
@Test
public void noneMatchTest(){
boolean flag = list.stream()
// 没有一个满足条件
.noneMatch(sku -> sku.getTotalPrice() > 100);
System.out.println(flag);
}
十、findFirst/findAny
@Test
public void findFirstTest(){
Optional<Sku> sku = list.stream()
.findFirst();// 查找第一个
System.out.println(sku.get().getSkuName());
}
@Test
public void findAnyTest(){
Optional<Sku> sku = list.stream()
.findAny();// 速度更快,但是可能随机
System.out.println(sku.get().getSkuName());
}
十一、max/min
@Test
public void maxTest(){
OptionalDouble max = list.stream()
// 筛选所有总价
.mapToDouble(Sku::getTotalPrice)
// 找出最大值
.max();
System.out.println(max.getAsDouble());
}
@Test
public void minTest(){
OptionalDouble min = list.stream()
// 筛选所有总价
.mapToDouble(Sku::getTotalPrice)
// 找出最小值
.min();
System.out.println(min.getAsDouble());
}
十二、count
@Test
public void countTest(){
long count = list.stream()
.count();
System.out.println(count);
}
本文详细介绍了Java Stream API的常用操作,包括filter的断言过滤、map的数据转换、peek的无返回值操作、sorted的排序、distinct的去重、skip的跳过、limit的截取、allMatch/anyMatch/noneMatch的匹配条件、findFirst/findAny的查找以及max/min的求最大最小值和count的计数方法。通过实例解析了这些操作在实际编程中的应用。
1万+

被折叠的 条评论
为什么被折叠?



