在Java8中,如何创建一个接受布尔条件和lambda的方法,并将参数作为参数?

在Java8中,如何创建一个接受布尔条件和lambda的方法,并将参数作为参数?,java,lambda,Java,Lambda,在Java8中,如何创建一个接受布尔条件和lambda的方法,并将参数作为参数 例如,我有很多这样的代码 if(something is true) { foo("a", "b", 2) } if(something else is true) { bar("hello", 1) } 想要创建一个接受布尔值和lambda的方法,这样我就可以计算出所有的if检查,这样我就可以这样做了 checkAndCAll(isValid, (a, b, c) -> { if(

在Java8中,如何创建一个接受布尔条件和lambda的方法,并将参数作为参数

例如,我有很多这样的代码

if(something is true) {
     foo("a", "b", 2)
}

if(something else is true) {
     bar("hello", 1)
}
想要创建一个接受布尔值和lambda的方法,这样我就可以计算出所有的if检查,这样我就可以这样做了

  checkAndCAll(isValid, (a, b, c) -> { if(isValid) foo(a, b, c); })
  checkAndCAll(isValid2, (a, b) -> { if(isValid2) bar(a, b, c); })

如果有更干净的东西,请建议

不要认为你想要的实现方式是好的,但不管怎样-这是你问的吗

public static void main(String[] args) {
    //how to use
    checkAndCAll(true, new Object[]{"param1", "param2"}, p -> someMethod(p));
    checkAndCAll(true, new Object[]{"param1", 2 , new AtomicInteger(124)}, p -> anotherMethod(p));
}

public static void checkAndCAll(boolean b, Object[] params, Consumer<Object[]> consumer) {
    if (b) consumer.accept(params);
}

public static void someMethod(Object[] args) {
    //some method to execute
    System.out.println(args);
}

public static void anotherMethod(Object[] args) {
    //some method to execute
    System.out.println(args);
}
publicstaticvoidmain(字符串[]args){
//如何使用
checkAndCAll(true,新对象[]{“param1”,“param2”},p->someMethod(p));
checkAndCAll(true,新对象[]{“param1”,2,新原子整数(124)},p->anotherMethod(p));
}
公共静态void checkAndCAll(布尔b,对象[]参数,使用者){
如果(b)消费者接受(参数);
}
公共静态方法(对象[]args){
//一些要执行的方法
系统输出打印项次(args);
}
公共静态void anotherMethod(对象[]args){
//一些要执行的方法
系统输出打印项次(args);
}

你认为你想要实现的方式一点也不好,但不管怎样——这就是你要问的吗

public static void main(String[] args) {
    //how to use
    checkAndCAll(true, new Object[]{"param1", "param2"}, p -> someMethod(p));
    checkAndCAll(true, new Object[]{"param1", 2 , new AtomicInteger(124)}, p -> anotherMethod(p));
}

public static void checkAndCAll(boolean b, Object[] params, Consumer<Object[]> consumer) {
    if (b) consumer.accept(params);
}

public static void someMethod(Object[] args) {
    //some method to execute
    System.out.println(args);
}

public static void anotherMethod(Object[] args) {
    //some method to execute
    System.out.println(args);
}
publicstaticvoidmain(字符串[]args){
//如何使用
checkAndCAll(true,新对象[]{“param1”,“param2”},p->someMethod(p));
checkAndCAll(true,新对象[]{“param1”,2,新原子整数(124)},p->anotherMethod(p));
}
公共静态void checkAndCAll(布尔b,对象[]参数,使用者){
如果(b)消费者接受(参数);
}
公共静态方法(对象[]args){
//一些要执行的方法
系统输出打印项次(args);
}
公共静态void anotherMethod(对象[]args){
//一些要执行的方法
系统输出打印项次(args);
}

可以更简单,参数可以直接传递给lambda:

public static void main(String[] args) {
    //how to use
    checkAndCAll(true, () -> someMethod("param1,", "param2"));
    checkAndCAll(false, () -> anotherMethod("param1", 123));
}

public static void checkAndCAll(boolean b, Runnable action) {
    if (b) action.run();
}

public static void someMethod(Object param1, Object param2) {
    //some method to execute
}

public static void anotherMethod(String param1, Integer param2) {
    //some method to execute
}

但我认为它不是很有用。传统的“if”需要相当数量的代码,而且可读性更高。事实上,它只复制了Java的“if”语句语义。

甚至更简单,参数可以直接传递给lambda:

public static void main(String[] args) {
    //how to use
    checkAndCAll(true, () -> someMethod("param1,", "param2"));
    checkAndCAll(false, () -> anotherMethod("param1", 123));
}

public static void checkAndCAll(boolean b, Runnable action) {
    if (b) action.run();
}

public static void someMethod(Object param1, Object param2) {
    //some method to execute
}

public static void anotherMethod(String param1, Integer param2) {
    //some method to execute
}


但我认为它不是很有用。传统的“if”需要相当数量的代码,而且可读性更高。事实上,它只复制了Java的“if”语句语义。

尝试变量参数列表,如:fun(boolean cond,Type…params)。或者,如果你想使用一些验证器,那么请阅读Javascript中的函数接口@RamonMarques的可能副本,我不理解这个链接,因此我问了这个问题here@user1870400这意味着你不能做你想做的事。java中的lambda不像ruby或任何其他语言中的lambda那样工作,您可能知道lambda是blocksTry可变参数列表,如:fun(布尔cond,Type…params)。或者,如果你想使用一些验证器,那么请阅读Javascript中的函数接口@RamonMarques的可能副本,我不理解这个链接,因此我问了这个问题here@user1870400这意味着你不能做你想做的事。java中的Lambdas不像ruby或其他任何语言中的Lambdas那样工作,你可能知道Lambdas是blocksIt's close,因此函数可以接受任何类型作为参数,所以我只是编辑了我的问题。另外,你能告诉我为什么你认为这一点都不好,你能推荐什么替代方案吗?因为你可以只做简单的if(boolean)callMethod();没有lambdas),但我不是企业开发人员,所以我不知道哪种解决方案更好)我刚刚回答了您在本例中提出的问题)它很接近,因此函数可以接受任何类型作为参数,所以我只是编辑了我的问题。另外,你能告诉我为什么你认为这一点都不好,你能推荐什么替代方案吗?因为你可以只做简单的if(boolean)callMethod();没有lambdas)但我不是企业开发人员,所以我不知道哪种解决方案更好)我刚刚回答了您在本例中提出的问题)非常感谢!看起来很干净!如果SomeMethod返回int而anotherMethod返回字符串呢?checkAndCall方法签名是否会更改?是的,它会更改,因为
Runnable.run()
不接受任何内容,也不返回任何内容。你需要一个功能接口,它不需要任何东西,只需要返回一些东西-太棒了!最后,如果someMethod或anotherMethod抛出异常怎么办。。。它取决于异常的类型,无论是否选中。在未检查异常的情况下,一切都将正常工作,异常可以通过lambda传播。在检查异常的情况下,它在默认情况下不会编译,因为它不能通过lambda接口传播,然后由您将其包装到另一个未检查异常中,在展开它的上方捕获它并重试-非常复杂:)非常感谢!看起来很干净!如果SomeMethod返回int而anotherMethod返回字符串呢?checkAndCall方法签名是否会更改?是的,它会更改,因为
Runnable.run()
不接受任何内容,也不返回任何内容。你需要一个功能接口,它不需要任何东西,只需要返回一些东西-太棒了!最后,如果someMethod或anotherMethod抛出异常怎么办。。。它取决于异常的类型,无论是否选中。在未检查异常的情况下,一切都将正常工作,异常可以通过lambda传播。在检查异常的情况下,默认情况下它不会编译,因为它不能通过lambda接口传播,然后由您将其包装到另一个未检查异常中,在展开它的上方捕获它并重新播放-非常复杂:)