假设我有一个使用lambda表达式(闭包)定义的对象列表.有没有办法检查它们,以便可以进行比较?
我最感兴趣的代码是
List<Strategy> strategies = getStrategies();
Strategy a = (Strategy) this::a;
if (strategies.contains(a)) { // ...
Run Code Online (Sandbox Code Playgroud)
完整的代码是
import java.util.Arrays;
import java.util.List;
public class ClosureEqualsMain {
interface Strategy {
void invoke(/*args*/);
default boolean equals(Object o) { // doesn't compile
return Closures.equals(this, o);
}
}
public void a() { }
public void b() { }
public void c() { }
public List<Strategy> getStrategies() {
return Arrays.asList(this::a, this::b, this::c);
}
private void testStrategies() {
List<Strategy> strategies = getStrategies();
System.out.println(strategies);
Strategy a = (Strategy) …Run Code Online (Sandbox Code Playgroud) 如果我使用新语法获取方法引用:
anObject::aMethod
Run Code Online (Sandbox Code Playgroud)
我总是得到同一个对象吗?也就是说,我可以相信对同一方法的两个引用是相同的吗?
例如,我很乐意知道是否计划将它们用作Runnable我可以添加和删除的回调:
someLibrary.addCallback(anObject::aMethod)
// later
someLibrary.removeCallback(sameObject::sameMethod)
Run Code Online (Sandbox Code Playgroud)
这是否需要在Runnable变量中保存引用以保持其稳定?
以下测试失败
@Test
public void test() {
Function<String, Integer> foo = Integer::parseInt;
Function<String, Integer> bar = Integer::parseInt;
assertThat(foo, equalTo(bar));
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让它通过?
编辑:我会尝试更清楚地说明我正在尝试做什么.
可以说我有这些课程:
class A {
public int foo(Function<String, Integer> foo) {...}
}
class B {
private final A a; // c'tor injected
public int bar() {
return a.foo(Integer::parseInt);
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我说我想为B编写单元测试:
@Test
public void test() {
A a = mock(A.class);
B b = new B(a);
b.bar();
verify(a).foo(Integer::parseInt);
}
Run Code Online (Sandbox Code Playgroud)
问题是测试失败,因为方法引用不相等.