当前位置: 首页 > 面试题库 >

Java 8链式方法参考?

蓝苗宣
2023-03-14
问题内容

假设有一个典型的Java Bean:

class MyBean {
    void setA(String id) {
    }

    void setB(String id) { 
    }

    List<String> getList() {
    }
}

我想在BiConsumer的帮助下创建一种更抽象的调用设置器的方式:

Map<SomeEnum, BiConsumer<MyBean, String>> map = ...
map.put(SomeEnum.A, MyBean::setA);
map.put(SomeEnum.B, MyBean::setB);
map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id));

有没有一种方法,以取代拉姆达(myBean, id) -> myBean.getList().add(id)用链式方法的参考,像(myBean.getList())::add或者myBean::getList::add还是其他什么东西?


问题答案:

不,方法引用不支持链接。在您的示例中,尚不清楚这两种方法中的哪种应接收第二个参数。

但是如果你坚持下去……

static <V,T,U> BiConsumer<V,U> filterFirstArg(BiConsumer<T,U> c, Function<V,T> f) {
    return (t,u)->c.accept(f.apply(t), u);
}

BiConsumer<MyBean, String> c = filterFirstArg(List::add, MyBean::getList);

该方法的命名建议将其视为已存在BiConsumer(此处为List.add),并在MyBean.getList()其第一个参数之前添加一个函数(此处为)。容易想象一下,用于过滤第二个参数或同时过滤两个参数的等效实用程序的样子。

但是,它对于将现有实现与另一个操作结合起来非常有用。在您的特定示例中,使用网站并不比普通的lambda表达式更好

BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id);


 类似资料:
  • 主要内容:1 Java8 方法参数反射的介绍,2 Method类,3 Method类的方法,4 Parameter类,5 Parameter类的方法,6 Java8 方法参数反射的案例1 Java8 方法参数反射的介绍 Java提供了一项新功能,您可以在其中获得任何方法或构造函数的形式参数的名称。java.lang.reflect包包含所有必需的类,例如Method和Parameter,可用于参数反射。 2 Method类 Method类提供有关类或接口上的单个方法的信息。反射的方法可以是类方法

  • 问题内容: 我正在使用Twitter4J。但是我要问的问题比较笼统。我想访问给定推文的用户ID。目前,我有以下两种选择: 我不喜欢第一个选项中的lambda表达式,也不喜欢在第二个选项中被迫调用两个。有没有办法建立方法引用链?我知道这行不通,但是我想知道是否还有其他选择。 问题答案: 不,这是两种方法。其他任何事情最终都只会变得不清楚。 但是,自您提出要求以来,这里有一些选择。 要么

  • 目前正在学习Java 8 lambda表达式和方法引用。 我想把一个没有参数和返回值的方法作为参数传递给另一个方法。我就是这样做的: 我知道如

  • 我阅读了关于Lambda表达式的Java 8教程,但不太了解“引用特定类型的任意对象的实例方法”的方法引用示例 在同一教程中,有一个示例“引用特定对象的实例方法”,看起来像。 我可以看到这个工作,因为方法compareByName与Comparator.comparelambda(a, b)具有相同的签名- 现在“引用特定类型的任意对象的实例方法”示例使用String::compareToIgno

  • 主要内容:1 Java8 forEach方法的介绍,2 Java8 forEach方法的声明,3 Java8 forEach方法的案例1,4 Java8 forEach方法的案例21 Java8 forEach方法的介绍 Java提供了一个新的forEach() 方法来迭代元素。它在Iterable和Stream接口中定义。这是Iterable接口中定义的默认方法。扩展Iterable接口的集合类可以使用forEach循环来迭代元素。 此方法采用单个参数,该参数是功能接口。因此,您可以将lamb