public class Main {
interface Capitalizer {
public String capitalize(String name);
}
public String toUpperCase() {
return "ALLCAPS";
}
public static void main(String[] args) {
Capitalizer c = String::toUpperCase; //This works
c = Main::toUpperCase; //Compile error
}
}
两者都是具有相同签名的实例方法。为什么一个有效,另一个无效?
String::toUpperCase的签名:
String toUpperCase()
你应该改变:
public String toUpperCase()
到
public static String toUpperCase(String text)
您应该阅读关于方法引用的java教程。不同类型的方法引用,还有一个类似的例子,String::compareToIgnoreCase
(引用特定类型的任意对象的实例方法)。
方法引用String::compareToIgnoreCase的等效lambda表达式将具有形式参数列表(字符串a、字符串b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)。
你有一个方法
public String capitalize(String name);
获取字符串并返回字符串。这种方法可以有许多模式。
构造函数
c = String::new; // calls new String(String)
// or
c = s -> new String(s);
String
上的一个函数,不接受参数
c = String::toLowerCase; // instance method String::toLowerCase()
// or
c = s -> s.toLowerCase();
将字符串作为唯一参数的方法的
// method which takes a String, but not a Main
public static String toUpperCase(String str) {
c = Main::toUpperCase;
// or
c = s -> toUpperCase(s);
在任何情况下,引用的方法都必须采用字符串。
如果没有,你可以这样做。
c = s -> capitalize(); // assuming Main.capitalize() is static
这告诉编译器忽略输入。
有3个结构可以引用方法:
对象::instanceMethod
类::instanceMethod
线路:
Capitalizer c = String::toUpperCase; //This works
使用3'rd构造-Class::instanceMethod。在这种情况下,第一个参数成为方法的目标。该构造等价于(翻译)以下Lambda:
Capitalizer = (String x) -> x.toUpperCase();
此Lambda表达式有效,因为Lambda获取String
作为参数并返回String
结果-如Capital alizer
接口所要求的。
线路:
c = Main::toUpperCase; //Compile error
翻译为:
(Main m) -> m.toUpperCase();
它不适用于Capital alizer
接口。您可以通过将Capital alizer
更改为:
interface Capitalizer {
public String capitalize(Main name);
}
在此更改后,将编译Main::toUpperCase。
当我从Cloud Foundry博客中读到以下内容时,我正试图弄清楚如何使用微CloudFoundry进行开发: “您不需要安装web服务器(Tomcat等)、运行时(Java、Ruby等)和服务(Postgres、MongoDB等),只需下载Micro Cloud Foundry,启动它,然后使用”VMC Push“部署应用程序。” 在开发过程中不断调用“VMC push”对我来说几乎是不可能的
我是从C++模板编程来的,有时会对泛型感到很困惑。由于没有方法专门化,我尝试使用了强制转换。以下是我的资料: 这不编译。 有什么办法可以让我做这个演员吗? 我想这样做的原因是:在C++模板中,我会为所支持的类型进行专门化,并创建一个抛出异常的非专门化版本。 其基本思想是:具有泛型方法的非泛型接口。尝试使用正确的类型获取值应该有效,尝试使用错误的类型则可能引发。 我们应该保持类型安全,所以我需要返回
我目前在辅导一个高中生AP Java,她问了我一个关于“双选”的问题。我以前从未听说过这个术语,但显然她的老师希望她在即将到来的期末考试中知道这个术语。 她的老师提供的例子是,如果你想将一个整数转换成一个字符串,你必须执行以下操作才能避免编译器错误: 问题是:你想在现实生活中什么时候这样做? 老师只提供了导致运行时错误的示例。此外,我从来不知道有一个术语,但这样做似乎是个坏主意,因为只有当两种类型
问题内容: 我试图将选择的A类“获取”方法传递给B类中的方法。我已经将Java PassMethod作为Parameter签出,但是我无法以合理的方式采用接口方法解决问题。我宁愿 不 使用Java 8(lambdas),并尽可能避免反射。我的感觉是,我以错误的方式看待自己的问题。这是我要完成的工作的特定简化示例: 我有一个包含一些字段和get-method的类: 接下来,我将主类实例化为Map的V
我正在使用JSP、JSTL和Java servlet创建登录/注册页面,并且在servlet的doPost()方法中使用: 当用户从索引中输入无效的登录凭据时发出警报。jsp。 这是有效的,但我不知道为什么有效;以下是我的问题: > 据我所知,我正在将请求和响应对象转发到索引。但是jsp页面如何处理这些对象呢?它是一堆html,响应对象也会被修改,以便包含索引的所有html代码。jsp? 为什么g