相关疑难解决方法(0)

有没有办法比较lambdas?

假设我有一个使用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)

java lambda java-8

76
推荐指数
3
解决办法
1万
查看次数

两个确切的方法参考不相等

以下测试失败

@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)

问题是测试失败,因为方法引用不相等.

java java-8

15
推荐指数
1
解决办法
3624
查看次数

标签 统计

java ×2

java-8 ×2

lambda ×1