Tag: 方法 引用

Java 8中的方法引用是否具有具体类型,如果是,它是什么?

这个问题与另一个问题密切相关。 但是,我觉得这个问题的公认答案并不是那么明确。 那么,Java 8中方法引用的类型是什么? 这里有一个关于如何将方法引用“强制转换”(解除?)到java.util.function.Function演示: package java8.lambda; import java.util.function.Function; public class Question { public static final class Greeter { private final String salutation; public Greeter(final String salutation) { this.salutation = salutation; } public String makeGreetingFor(final String name) { return String.format(“%s, %s!”, salutation, name); } } public static void main(String[] args) { final Greeter helloGreeter = […]

Objects :: nonNull和x – > x!= null之间有什么区别吗?

考虑以下课程: import java.util.Objects; import java.util.function.Predicate; public class LambdaVsMethodRef { public static void main(String[] args) { Predicate a = Objects::nonNull; Predicate b = x -> x != null; } } 第一个谓词是从方法引用创建的,另一个是lambda表达式。 这些谓词具有相同的行为( nonNull的主体只是return obj != null; )。 lambda短两个字符(可能允许流管道适合一行)。 除了代码风格, Objects::nonNull和x -> x != null之间有什么区别吗? 换句话说,我应该更喜欢一个吗? lambda-dev和lambda-libs-spec- {观察者,专家}邮件列表消息提到isNull , nonNull和isNotNull (早期名称)没有解决这一点。 (我很惊讶没有人质疑添加Objects方法,因为它们可以用lambda轻松替换,但另一方面, Integer::sum也是如此。) 我还用javap查看了字节码。 唯一的区别是传递给lambda metafactory bootstrap方法的方法句柄: […]

请使用类名解释Java 8方法参考实例方法

public interface MyFunc { boolean func(T v1, T v2); } public class HighTemp { private int hTemp; HighTemp(){ } public HighTemp(int ht) { this.hTemp = ht; } boolean sameTemp(HighTemp ht2){ return hTemp == ht2.hTemp; } boolean lessThanTemp(HighTemp ht2){ return hTemp < ht2.hTemp; } } class InstMethWithObjRef { static int counter(T[] vals, MyFunc f, T v){ […]

是否可以将方法引用转换为MethodHandle?

是否可以将方法引用(例如SomeClass::someMethod )转换为MethodHandle实例? 我想要编译时检查的好处(确保存在类和方法)以及使用MethodHandle API内省方法的能力。 用例:当且仅当请求未被特定方法触发时(我要避免无限递归),我才需要执行代码。 我想进行编译时检查以确保类/方法存在但运行时检查以将调用者与方法进行比较。 那么回顾一下: 是否可以将方法引用转换为MethodHandle ?

Java 8链式方法参考?

假设有一个典型的Java Bean: class MyBean { void setA(String id) { } void setB(String id) { } List getList() { } } 我想在BiConsumer的帮助下创建一种更抽象的方式来调用setter: Map<SomeEnum, BiConsumer> map = … map.put(SomeEnum.A, MyBean::setA); map.put(SomeEnum.B, MyBean::setB); map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id)); 有没有办法用链式方法引用替换lambda (myBean, id) -> myBean.getList().add(id) ,类似于(myBean.getList())::add或myBean::getList::add还是其他什么?

使用带参数的方法引用

我刚开始学习Java流并遇到了问题。 请看下面的例子。 这是Node类的一部分: private Map nodes; public Optional child(String name) { return Optional.ofNullable(nodes.get(name)); } private void findChildren(String name, List result) { child(name).ifPresent(result::add); nodes.values().stream() // .map(Node::findChildren(name, result)) // .forEach(Node::findChildren(name, result)) .forEach(node -> node.findChildren(name, result)); } 我的目的是使用流中每个节点上的名称和结果参数调用#findChildren。 我试图使用方法引用Node :: findChildren没有运气。 我很欣赏其他与->运算符的解决方案。 是否可以将方法引用与参数一起使用? 我喜欢流的想法,我只想让代码更具可读性。 实际上,我认为有一个类似的问题方法引用与我读过的参数 ,但无法弄清楚如何在我的代码中使用bind2方法。 这是唯一的解决方案吗?

Java 8:方法引用Bound Receiver和UnBound Receiver之间的区别

我试图在我的代码中使用Java 8方法引用。 有四种类型的方法参考可用。 静态方法参考。 实例方法(绑定接收器)。 实例方法(UnBound接收器)。 构造函数参考。 使用Static method reference和Constructor reference我没有问题,但Instance Method (Bound receiver)和Instance Method (UnBound receiver)确实让我很困惑。 在Bound接收器中,我们使用Object引用变量来调用方法,如: objectRef::Instance Method 在UnBound接收器中,我们使用类名来调用方法,如: ClassName::Instance Method. 我有以下问题: 实例方法的不同类型的方法引用需要什么? Bound和Unbound接收方法引用之间有什么区别? 我们应该在哪里使用Bound接收器?我们应该在哪里使用Unbound接收器? 我还从Java 8语言特性书中找到了Bound和Unbound接收器的解释,但仍然与实际概念混淆。