1 重点
peek方法的使用
sorted方法的使用
reversed方法的使用
peek案例(无状态中间操作与forEach结合使用) 和 sorted案例(有状态中间操作与forEach结合使用)打印日志的区别
2 实战演示之peek:
package com.imooc.zhangxiaoxi.stream; import com.alibaba.fastjson.JSONObject; import com.imooc.zhangxiaoxi.lambda.cart.CartService; import com.imooc.zhangxiaoxi.lambda.cart.Sku; import com.imooc.zhangxiaoxi.lambda.cart.SkuCategoryEnum; import org.junit.Before; import org.junit.Test; import java.util.Arrays; import java.util.Comparator; import java.util.List; /** * StreamOperator * 作用:演示各种流的操作 * @author 魏豆豆 * @date 2020/4/11 */ public class StreamOperator { private List<Sku> list; /** * 初始化购物车车 */ @Before public void init(){ list = CartService.getSkuList(); } /** * filter的方法使用 * * 过滤出只有书籍的商品并进行打印 */ @Test public void filterTest(){ list.stream() //filter方法:如果条件为true则保留,否则过滤掉 .filter(sku -> sku.getSkuCategory().equals(SkuCategoryEnum.BOOKS)) //item(可以是其他变量):为该流的每个元素执行一个操作 .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } /** * map方法的使用 * * 找出购物车中所有商品的名称并进行打印 */ @Test public void mapTest(){ list.stream() .map(sku -> sku.getSkuName()) .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } /** * flatMap方法的使用:将一个对象转换成一个流 * * 找出购物车所有的商品名称并进行打印 */ @Test public void flatMap(){ list.stream() //注意:flatMap是对源处理为Stream流之后才能继续操作 .flatMap(sku -> Arrays.stream(sku.getSkuName().split(""))) .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } /** * peek方法使用: */ @Test public void peek(){ list.stream() .peek((Sku)->System.out.println(Sku.getSkuName())) //item(可以是其他变量):为该流的每个元素执行一个操作 //peek操作是中间操作,操作完后,流仍然可以使用,forEach是终端操作,操作后,流不能再被使用 //无状态的操作+终端操作(peek案例),就会从上到下依次执行,但是有状态的操作(sortTest案例),会先汇总,汇总之后,再循环;具体的区别通过peek案例和sortTest打印日志查看 .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } @Test public void sortTest(){ list.stream() .peek(Sku->System.out.println(Sku.getSkuName())) //有reversed 反序从大到小 ,无reversed 正序从小到大 //sorted 有状态 .sorted(Comparator.comparing(Sku::getTotalPrice).reversed()) .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } }
打印日志:
无人机 { "skuCategory":"ELECTRONICS", "skuId":2020001, "skuName":"无人机", "skuPrice":999.0, "totalNum":1, "totalPrice":999.0 } T-shirt { "skuCategory":"CLOTHING", "skuId":2020002, "skuName":"T-shirt", "skuPrice":50.0, "totalNum":2, "totalPrice":100.0 } 人生的枷锁 { "skuCategory":"BOOKS", "skuId":2020003, "skuName":"人生的枷锁", "skuPrice":30.0, "totalNum":1, "totalPrice":30.0 } 老人与海 { "skuCategory":"BOOKS", "skuId":2020004, "skuName":"老人与海", "skuPrice":20.0, "totalNum":1, "totalPrice":20.0 } 剑指高效编程 { "skuCategory":"BOOKS", "skuId":2020005, "skuName":"剑指高效编程", "skuPrice":288.0, "totalNum":1, "totalPrice":288.0 } 大头皮鞋 { "skuCategory":"CLOTHING", "skuId":2020006, "skuName":"大头皮鞋", "skuPrice":300.0, "totalNum":1, "totalPrice":300.0 } 杠铃 { "skuCategory":"SPROTS", "skuId":2020007, "skuName":"杠铃", "skuPrice":2000.0, "totalNum":1, "totalPrice":2000.0 } ThinkPad { "skuCategory":"ELECTRONICS", "skuId":2020008, "skuName":"ThinkPad", "skuPrice":5000.0, "totalNum":1, "totalPrice":5000.0 } Process finished with exit code 0
3 实战演示之排序(sorted):
package com.imooc.zhangxiaoxi.stream; import com.alibaba.fastjson.JSONObject; import com.imooc.zhangxiaoxi.lambda.cart.CartService; import com.imooc.zhangxiaoxi.lambda.cart.Sku; import com.imooc.zhangxiaoxi.lambda.cart.SkuCategoryEnum; import org.junit.Before; import org.junit.Test; import java.util.Arrays; import java.util.Comparator; import java.util.List; /** * StreamOperator * 作用:演示各种流的操作 * @author 魏豆豆 * @date 2020/4/11 */ public class StreamOperator { private List<Sku> list; /** * 初始化购物车车 */ @Before public void init(){ list = CartService.getSkuList(); } /** * filter的方法使用 * * 过滤出只有书籍的商品并进行打印 */ @Test public void filterTest(){ list.stream() //filter方法:如果条件为true则保留,否则过滤掉 .filter(sku -> sku.getSkuCategory().equals(SkuCategoryEnum.BOOKS)) //item(可以是其他变量):为该流的每个元素执行一个操作 .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } /** * map方法的使用 * * 找出购物车中所有商品的名称并进行打印 */ @Test public void mapTest(){ list.stream() .map(sku -> sku.getSkuName()) .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } /** * flatMap方法的使用:将一个对象转换成一个流 * * 找出购物车所有的商品名称并进行打印 */ @Test public void flatMap(){ list.stream() //注意:flatMap是对源处理为Stream流之后才能继续操作 .flatMap(sku -> Arrays.stream(sku.getSkuName().split(""))) .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } /** * peek方法使用: */ @Test public void peek(){ list.stream() .peek((Sku)->System.out.println(Sku.getSkuName())) //item(可以是其他变量):为该流的每个元素执行一个操作 //peek操作是中间操作,操作完后,流仍然可以使用,forEach是终端操作,操作后,流不能再被使用 //无状态的操作+终端操作(peek案例),就会从上到下依次执行,但是有状态的操作(sortTest案例),会先汇总,汇总之后,再循环;具体的区别通过peek案例和sortTest打印日志查看 .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } @Test public void sortTest(){ list.stream() .peek(Sku->System.out.println(Sku.getSkuName())) //有reversed 反序从大到小 ,无reversed 正序从小到大 //sorted 有状态 .sorted(Comparator.comparing(Sku::getTotalPrice).reversed()) .forEach(item->System.out.println(JSONObject.toJSONString(item,true))); } }
打印日志:
无人机 T-shirt 人生的枷锁 老人与海 剑指高效编程 大头皮鞋 杠铃 ThinkPad { "skuCategory":"ELECTRONICS", "skuId":2020008, "skuName":"ThinkPad", "skuPrice":5000.0, "totalNum":1, "totalPrice":5000.0 } { "skuCategory":"SPROTS", "skuId":2020007, "skuName":"杠铃", "skuPrice":2000.0, "totalNum":1, "totalPrice":2000.0 } { "skuCategory":"ELECTRONICS", "skuId":2020001, "skuName":"无人机", "skuPrice":999.0, "totalNum":1, "totalPrice":999.0 } { "skuCategory":"CLOTHING", "skuId":2020006, "skuName":"大头皮鞋", "skuPrice":300.0, "totalNum":1, "totalPrice":300.0 } { "skuCategory":"BOOKS", "skuId":2020005, "skuName":"剑指高效编程", "skuPrice":288.0, "totalNum":1, "totalPrice":288.0 } { "skuCategory":"CLOTHING", "skuId":2020002, "skuName":"T-shirt", "skuPrice":50.0, "totalNum":2, "totalPrice":100.0 } { "skuCategory":"BOOKS", "skuId":2020003, "skuName":"人生的枷锁", "skuPrice":30.0, "totalNum":1, "totalPrice":30.0 } { "skuCategory":"BOOKS", "skuId":2020004, "skuName":"老人与海", "skuPrice":20.0, "totalNum":1, "totalPrice":20.0 } Process finished with exit code 0
诸葛