【问题标题】:Unknown syntax in Java CodeJava 代码中的未知语法
【发布时间】:2016-11-11 23:37:07
【问题描述】:

我正在通过 https://spring.io/guides/tutorials/bookmarks/ 的 Spring 教程构建 REST 服务

我被困在一个点上。在class Application 中有一段诡异的代码:

return (evt) -> Arrays.asList(
"jhoeller,dsyer,pwebb,ogierke,rwinch,mfisher,mpollack,jlong".split(","))
.forEach(
a -> {
Account account = accountRepository.save(new Account(a,
"password"));
bookmarkRepository.save(new Bookmark(account,
"http://bookmark.com/1/" + a, "A description"));
bookmarkRepository.save(new Bookmark(account,
"http://bookmark.com/2/" + a, "A description"));
});

我真的不知道那里发生了什么。 evt 来自哪里,没有相关的导入。 -> 运算符在 Java 中做了什么。我从未在 Java 中使用过这个运算符。首先,有没有这样的运营商?

即使我的日食也说同样的话

evt 无法解析为变量

似乎没有人在网上问过类似的问题,我搜索了很多。我错过了什么吗?

【问题讨论】:

  • 这是 Java 8 语法(一个 lambda 表达式,即一种匿名函数),根据您的描述,您似乎对 Java 8 并不熟悉。您可能仍在运行 Java 7 或更早版本。
  • 这看起来像 Java 8 中的 Java lambda 表示法。您可以查看是否有 Java 7 版本的教程,或者这里是 lambdas 的 oracles 指南docs.oracle.com/javase/tutorial/java/javaOO/…
  • @tobias_k 好的,我明白了。感谢您提供的信息,以及 evt.这是否也属于新的语法定义。我的意思是,如果不定义标识符,我们可以这样使用它们吗?有链接吗?
  • 是的,它是新符号的一部分,evt 的类型将由编译器推断。如果你将你的eclipse项目切换到使用JDK 8,上面的代码应该没有问题,至少理论上是这样
  • evt 被定义在 lambda 表达式中。那个表达式,evt -> Arrays.asList(...) 大致相当于new Function() {public List apply(Event evt) {return Arrays.asList(...)}}

标签: java eclipse spring rest spring-boot


【解决方案1】:

这是 Java 8 语法(一个 lambda 表达式,即某种匿名函数),根据您的描述,您似乎对 Java 8 并不熟悉。您可能仍在运行 Java 7 或更早版本。您可以使用java -version 命令检查您的 Java 版本。

关于evt:定义在的lambda表达式,大致相当于这个:

new Consumer<Event>() {
    @Override
    public void accept(Event evt) {
        for (String a: Arrays.asList("jhoeller,dsyer,pwebb,ogierke,rwinch,mfisher,mpollack,jlong".split(",")) {
            Account account = accountRepository.save(new Account(a,
                    "password"));
            bookmarkRepository.save(new Bookmark(account,
                    "http://bookmark.com/1/" + a, "A description"));
            bookmarkRepository.save(new Bookmark(account,
                    "http://bookmark.com/2/" + a, "A description"));
        }
    }
}

如果您想运行该代码,则必须下载并安装新版本的 Java。如果您已经在使用 Java 8,那么您可能必须正确配置您的系统。

我从您的 cmets 得知您正在使用 Eclipse。首先,您必须使用可以处理 Java 8(Luna 或更新版本)的 Eclipse,然后在 Eclipse 中选择正确的 JDK(Preferences -> Java -> Installed JREs),并设置源兼容性您的项目级别到 Java 8(项目的属性 -> Java 编译器 -> JDK 合规性)。

【讨论】:

  • 谢谢,我使用的是 Kepler,因此不支持 Java 8。
  • @AadishPatodi Kepler 也进行了升级以启用 Java 8 支持,但鉴于它现在已经三年了,我认为是时候继续前进了。 ;-)
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2015-08-30
  • 2020-11-08
相关资源
最近更新 更多