一、需求背景
Java8的Optional接口是我们经常使用的一个接口,尤其是对对象进行判空的时候,需要经常使用到IfPresent()
。
但是,如果是对List进行判空、循环的话,就稍显繁杂了,因为几乎每次对List进行操作的时候,都需要先进行IfPresent
,然后再调用forEach()
;那么,能否自己写一个方法,将这两结合起来呢?,其实也不难,大致实现如下:
二、具体实现
具体实现步骤、调用方法如下:
- 具体实现
/**
* 如果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));
}
- 调用
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);
}
- 输出结果
-------------------原始调用操作结果-------------------
A
B
C
[A, B, C]
-------------------原始自定义增强方法操作结果-------------------
A
B
C
[A, B, C]
可以看到,通过上述组合以后,简化了ifPresent
和forEach
调用的步骤,并且与原始的调用方法无二.
- 优化
我们还可以对上述方法进行如下优化
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);
}
- 进阶
如果我想在循环的过程中把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);
}