Java 此处不应引用方法
Java Method reference not expected here
对于 Java8 的实例,您究竟如何链接方法引用?示例:
Collections.sort(civs,Comparator.comparing(Civilization::getStrategy.getStrategLevel));
Civilization
实例的 getStrategy
return 是具有实例方法 getStrategyLevel
的 Strategy
对象实例。
为什么 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 表达式或创建静态方法。
有四种方法参考:
- 引用静态方法,例如
ContainingClass::staticMethodName
- 引用特定对象的实例方法如
containingObject::instanceMethodName
- 引用特定类型的任意对象的实例方法,例如
ContainingType::methodName
- 引用构造函数,如
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语法允许的。
对于 Java8 的实例,您究竟如何链接方法引用?示例:
Collections.sort(civs,Comparator.comparing(Civilization::getStrategy.getStrategLevel));
Civilization
实例的 getStrategy
return 是具有实例方法 getStrategyLevel
的 Strategy
对象实例。
为什么 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 表达式或创建静态方法。
有四种方法参考:
- 引用静态方法,例如
ContainingClass::staticMethodName
- 引用特定对象的实例方法如
containingObject::instanceMethodName
- 引用特定类型的任意对象的实例方法,例如
ContainingType::methodName
- 引用构造函数,如
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语法允许的。