Java8 IfPresent 与 forEach 的组合操作

一、需求背景

      Java8的Optional接口是我们经常使用的一个接口,尤其是对对象进行判空的时候,需要经常使用到IfPresent()
      但是,如果是对List进行判空、循环的话,就稍显繁杂了,因为几乎每次对List进行操作的时候,都需要先进行IfPresent,然后再调用forEach();那么,能否自己写一个方法,将这两结合起来呢?,其实也不难,大致实现如下:

二、具体实现

      具体实现步骤、调用方法如下:

  1. 具体实现
/**
     * 如果List的IfPresent判断通过,就调用forEach循环
     * @param optionalList  待操作的list
     * @param action forEach操作
     * @param <T> 消费者对象
     */
    public static <T> void forEachIfPresent(Optional<List<T>> optionalList, Consumer<T> action) {
        optionalList.ifPresent(items -> items.forEach(action));
    } 
  1. 调用
 public static void main(String[] args) {
        Optional<List<String>> optionalList = Optional.ofNullable(Arrays.asList("A", "B", "C"));
        List<String> list = new ArrayList<>();
        // 原始的ifPresent、forEach调用
        System.out.println("-------------------原始调用操作结果-------------------");
        optionalList.ifPresent(items -> {
            items.forEach(item -> {
                System.out.println(item);
                list.add(item);
            });
        });
        System.out.println(list);
        list.clear();
        // 调用自定义方法实现ifPresent以及forEach循环操作
        System.out.println("-------------------原始自定义增强方法操作结果-------------------");
        forEachIfPresent(optionalList,item->{
            System.out.println(item);
            list.add(item);
        });
        System.out.println(list);
    }
  1. 输出结果
-------------------原始调用操作结果-------------------
A
B
C
[A, B, C]
-------------------原始自定义增强方法操作结果-------------------
A
B
C
[A, B, C]

可以看到,通过上述组合以后,简化了ifPresentforEach调用的步骤,并且与原始的调用方法无二.


  1. 优化
    我们还可以对上述方法进行如下优化
   public static <T> void forEachIfNotEmpty(List<T> optionalList, Consumer<T> action) {
        if (CollectionUtil.isEmpty(optionalList)) {
            return;
        }
        List<T> list = optionalList.stream().filter(Objects::nonNull).collect(Collectors.toList());
        if (CollectionUtil.isEmpty(list)) {
            return;
        }
        list.parallelStream().forEach(action);
    }
  1. 进阶
    如果我想在循环的过程中把list集合本身也传递进去,是否可以实现呢?这个需求也不难,具体如下:
/**
     * 循环的过程中将list本身传递进去
     * @param optionalList
     * @param action
     * @param <T>
     */
    public static <T> void forEachIfNotEmpty(List<T> optionalList, BiConsumer<List<T>, T> action) {
        if (CollectionUtil.isEmpty(optionalList)) {
            return;
        }
        List<T> list = optionalList.stream().filter(Objects::nonNull).collect(Collectors.toList());
        if (CollectionUtil.isEmpty(list)) {
            return;
        }
        list.parallelStream().forEach(item -> action.accept(list, item));
    }

调用:

 public static void main(String[] args) {
        List<String> myList = Arrays.asList("apple", "banana", "orange");
        // 定义一个BiConsumer来处理列表和列表中的元素
        BiConsumer<List<String>, String> listElementConsumer = (list, element) -> {
            System.out.println("当前元素: " + element);
            System.out.println("整个list集合: " + list);
        };

        // 调用forEachIfNotEmpty方法
        forEachIfNotEmpty(myList, listElementConsumer);
    }
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值