流式编程-Stream实操

本文详细介绍了Java Stream API的常用操作,包括filter的断言过滤、map的数据转换、peek的无返回值操作、sorted的排序、distinct的去重、skip的跳过、limit的截取、allMatch/anyMatch/noneMatch的匹配条件、findFirst/findAny的查找以及max/min的求最大最小值和count的计数方法。通过实例解析了这些操作在实际编程中的应用。

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);
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值