如何摆脱消费者循环

问题描述

基于用户@eitan https://stackoverflow.com/a/37334159/11214643给出的响应,基于如何执行使用lambda进行自动转换的可读切换案例,也基于用户@ Al-Mothafar的问题,我认为这是有效的要尝试中断循环而不是仅失败执行循环中的所有使用者,是否有一种方法可以遍历所有使用者并在其中一个使用者接受()子句的情况下中断迭代?

我当时在想这样的事情,这样做有什么好处吗?

public static <T> void switchType(Object o,@NotNull Consumer... a) {
    AtomicBoolean accepted = new AtomicBoolean(false);
    for (Consumer consumer : a) {

//I'm not sure if the andThen() method will only execute if the ifPresent(c) clause of the original consumer (code down below) executes. 
//If the andThen() method always executes regardless of whether the execution of the first accept() materializes or not,then this wont work because it will always be executed.

        consumer.andThen(
                object -> {
                    accepted.set(true);   

                }
        );
        if (accepted.get()) break;
     }
  }

这个分支对性能的影响是否比仅对所有使用者执行失败都要糟糕?

@eitan的答案中的消费者方法

public static <T> Consumer caze(Class<T> cls,Consumer<T> c) {
    return obj -> Optional.of(obj).filter(cls::isinstance).map(cls::cast).ifPresent(c);
} 

解决方法

我找到了一种方法,可以通过创建一个提供布尔值的接口来打破循环,该接口在执行Optional验证和Consumer执行之后,返回是否为.isPresent()值。

public class Switch {
    public static <T> void caze(Object o,Caze... a) {
        for (Caze consumer : a) {
            if (consumer.isPresent(o)) break;
        }
    }

    @FunctionalInterface
    public interface Caze {
        boolean isPresent(Object obj);
    }

    public static <T> Caze type(Class<T> cls,Consumer<T> c) {
        return obj -> {
            Optional<T> o = Optional.of(obj).filter(cls::isInstance).map(cls::cast);
            o.ifPresent(c);
            return o.isPresent();
        };
    }
}

这使循环可以检查它是否应该中断。