Java 此处不应引用方法

Java Method reference not expected here

对于 Java8 的实例,您究竟如何链接方法引用?示例:

Collections.sort(civs,Comparator.comparing(Civilization::getStrategy.getStrategLevel));
Civilization 实例的

getStrategy return 是具有实例方法 getStrategyLevelStrategy 对象实例。

为什么 Comparator.comparing 方法 return 不是具有由 lambda 表达式实现的功能接口的比较器?

在那种情况下,您应该使用 lambda,不能直接应用方法引用:

Collections.sort(civs, Collectors.comparing(c -> c.getStrategy().getStrategLevel()));

不过,这里有一种方法可以使用方法引用。假设你有一个 class 喜欢

class CivilizationUtils {
    public static Integer getKeyExtractor(Civilization c) {
        return c.getStrategy().getStrategLevel();
    }
}

问题可以这样解决

Collections.sort(civs, Collectors.comparing(CivilizationUtils::getKeyExtractor));
Collections.sort(civs,Comparator.comparing(civ -> civ.getStrategy().getStrategLevel()));

不能使用方法引用,您需要使用 lambda 表达式或创建静态方法。

有四种方法参考:

  1. 引用静态方法,例如ContainingClass::staticMethodName
  2. 引用特定对象的实例方法containingObject::instanceMethodName
  3. 引用特定类型的任意对象的实例方法,例如ContainingType::methodName
  4. 引用构造函数,如ClassName::new

有关 method reference 的更多详细信息。

所以在这里,lambda expression 会是:

Collections.sort(civs, Comparator.comparing(c -> c.getStrategy.getStrategLevel()));

或者如果您创建静态方法

public static int getStrategLevel(Civilization c) {
    return c.getStrategy().getStrategLevel();
}

那么您的代码将是:

Collections.sort(civs, Comparator.comparing(MyClass::getStrategLevel));

不同的例子,但我有一个方法

void m(Predicate<String> stringPredicate)

和一个实用程序 class

class Utilities {
  static boolean condition1(String s) { ... }
  static boolean condition2(String s) { ... }
  ...
}

我想用一个谓词调用 m returns true 当且仅当 Utilities.condition1 returns false。 Java 语法允许我写

m(Utilities::condition1)

但不是

m(Utilities::condition1.negate())

(不幸违反了referential transparency),编译器抱怨,"Java Method reference not expected here."

我的解决方法是编写一个方法

Predicate<String> not(Predicate<String> p) {
  return p;
}

然后写调用

m(not(Utilities::condition1))

--Java语法允许的。