【问题标题】:Creating array of methods returning boolean and iterating through for-each loop创建返回布尔值并遍历 for-each 循环的方法数组
【发布时间】:2016-07-13 04:00:25
【问题描述】:

好的,所以我有一批方法返回 boolean 的值 true/false

private void saveChangesOnEditButtonActionPerformed(java.awt.event.ActionEvent evt) {                                                        
        updateMainTabsAccess();
        updateUserPaymentTabPermissions();
        updateUserRegistrationTabPermissions();
        updateUserStudentsTabPermissions();
        updateUserFacultyTabPermissions();
        updateUserHomePermissions(); //saves any update made on existing user settings/permissions
        updateUserInformation(); // sasve any update made on existing user information such as username
    }  

我想知道是否可以通过 for-each 循环检查每个方法的返回值。

我正在考虑创建一个private boolean isUpdateSuccessful() 方法。 说喜欢,

private boolean isUpdateSuccessful(){
    Boolean a = updateMainTabsAccess();
    Boolean b = updateUserPaymentTabPermissions();
    //........so on....
    Boolean result = (a && b &&...)
    return result;
}

问题是,我不知道是否可以将它们放在数组列表或组件数组中

ArrayList<Boolean> listOfMethods = new ArrayList<Boolean>(method1,method2..);

这样我就可以通过for-each 循环检查每一个

for(Boolean b:listOfMethods){
    Boolean successful=true;
    successful =  (successful && b)
}

我的问题是:

1.) 如何提取这些方法的返回值并使用这些方法初始化Arraylist

2.) 使用for-each 循环,有没有我想要做的事情的可能性?我没有,那你建议我做什么?

如果有任何答案或建议,我将不胜感激。我只是想检查每种方法是否成功。我想用?1:0:

提前致谢。

【问题讨论】:

    标签: java arraylist methods


    【解决方案1】:

    这是在 Java 8 未引入 Lambda 时实现目标的旧式方法。

    public class TestMethodsListCall {
    
        public abstract class Checker {
            public abstract boolean check();
        }
    
        public static void main(String[] args) {
            new TestMethodsListCall();
        }
    
        public TestMethodsListCall() {
            final TestMethodsListCall that = this;
            List<Checker> checkers = Arrays.asList( //
                    new Checker() { public boolean check() { return that.methodA(); } }, //
                    new Checker() { public boolean check() { return that.methodB(); } }  //
                    // , ...
            );
    
            boolean res = true;
            for (Checker c : checkers) {
                res = res & c.check();
                if (!res) {
                    // Break, display some message or all together
                }
            }
        }
    
        public boolean methodA() {
            return true;
        }
    
        public boolean methodB() {
            return false;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您已经收到了一些答案。 如果您使用的是 java 8,Fabian 是一个不错的选择。

      但要直接回答你的观点

      1.) 如何提取这些方法的返回值并使用这些方法来初始化 Arraylist。

          ArrayList<Boolean> resultsList = new ArrayList<Boolean>();
      
          resultsList.add(updateMainTabsAccess());
          ...
      

      2.) 使用 for-each 循环,有没有我想要做的事情的可能性?我没有,那你建议我做什么?

          boolean res = true;
      
          for (Boolean singleResult : resultsList) {
              res = res && singleResult;
          }
      

      【讨论】:

        【解决方案3】:

        这将在您的类中找到所有方法,这些方法在自动逐个调用方法并存储对成功变量的响应后返回布尔值

        import java.lang.reflect.InvocationTargetException;
        import java.lang.reflect.Method;
        import java.util.List;
        
        public class Test {
        
            public static void main(String[] args) {
                Test test = new Test();
                Class c = test.getClass();      
                boolean successful = true; 
                for (Method method : c.getDeclaredMethods()) {
                        if (method.getReturnType().toString().equals("boolean")) {
                            try {
                                String mname = method.getName();
                                Object o = method.invoke(test, null);
                                System.out.format("%s() returned %b%n", mname, (Boolean) o);
                                successful =  successful && (Boolean) o;
        
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                }       
                System.out.println("final answer : " + successful);
            }
        
            public boolean a() {
                return true;
            }
        
            public boolean b() {
                return false;
            }
        
            public boolean c() {
                return false;
            }
        
        }
        

        希望对您有所帮助。

        【讨论】:

        • 这是一个不断发展的解决方案。
        【解决方案4】:

        为什么不使用Stream 来检查结果:

        Stream.<Boolean>of(updateMainTabsAccess(),
            updateUserPaymentTabPermissions(),
            updateUserRegistrationTabPermissions(),
            updateUserStudentsTabPermissions(),
            updateUserFacultyTabPermissions(),
            updateUserHomePermissions(),
            updateUserInformation()).allMatch(b -> b);
        

        这样您就可以摆脱短路评估,也不需要为每个方法创建方法引用。

        方法参考

        List<Supplier<Boolean>> methods = Arrays.asList(this::updateMainTabsAccess,
                                                        this::updateUserPaymentTabPermissions,
                                                        ...
        );
        
        for (Supplier<Boolean> supplier : methods) {
            boolean methodResult = supplier.get();
            ...
        }
        

        虽然这很难被认为是一种改进......

        【讨论】:

          【解决方案5】:

          如果您希望每个方法都被执行并检查每个方法是否成功,您可以简单地编写

          boolean success = updateMainTabsAccess() &
              updateUserPaymentTabPermissions() &
              updateUserRegistrationTabPermissions() &
              updateUserStudentsTabPermissions() &
              updateUserFacultyTabPermissions() &
              updateUserHomePermissions() &
              updateUserInformation(); 
          

          【讨论】:

            【解决方案6】:

            如果我是你,我会这样做。只是一个示例代码:

            private void saveChangesOnEditButtonActionPerformed(java.awt.event.ActionEvent evt) {
                if (updateMainTabsAccess()) {
                    if (updateUserPaymentTabPermissions()) {
                        if (updateUserRegistrationTabPermissions()) {
                            ...
                        } else {
                            // error on update registration
                        }
                    } else {
                        // error on update payment
                    }
                }
            

            用上面的样式:

            • 当前一个方法失败时,您不会执行其他方法。
            • 可以为每个错误提供详细的错误消息。
            • 您无需维护集合和迭代。

            【讨论】:

            • 这会导致很多ifs在其他ifs下。最多三个级别。在代码开始难以阅读或更糟糕的无法维护之后。
            猜你喜欢
            • 2012-03-10
            • 2015-11-08
            • 2018-07-17
            • 1970-01-01
            • 2020-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多