当前位置: 首页 > 面试题库 >

适用于Clojure用户的Java

向弘懿
2023-03-14
问题内容

我一直在使用和关闭Lisp,而我正在赶上Clojure。clojure的好处是我可以自然地使用所有java函数,而clojure的坏处也是我必须自然地了解java函数。

例如,我不得不花一些时间(查找)来查找Java中的平方函数(clojure表示法中的Math / sqrt)。

您能为我不太熟悉Java的Clojure用户推荐一些有关Java函数(库)的良好信息资源吗?

它可以是任何东西-好书,网页,论坛或其他任何东西。


问题答案:

刚开始使用Clojure时,我遇到了类似的问题。我几年前做了一些Java开发,但是对那里的库还是很陌生。

我发现使用Java的最简单方法是不 真正 使用它。我认为刚开始使用Clojure的Java会有点书本。除非真正开始学习JVM /
Java库,否则您实际上并不需要了解太多。让我解释。

花更多时间学习如何内外使用Clojure,并熟悉Clojure-Contrib。例如,在clojure.contrib sqrt
中的generic.math函数中。

实际上,您需要的许多东西已经在Clojure中了-但还有很多东西还没有。

熟悉使用Java的Clojure中的调用约定和语法糖。例如Math/sqrt,按照您的示例,正​​在sqrt从class
调用静态方法(基本上只是一个函数)Math

无论如何,如果您发现自己 确实 需要使用Java ,这里的指南应该可以帮助您入门。我将假设您已经完成了 一些
命令式的OO编程,但除此之外没有其他很多。即使没有,您也应该没事。

艾萨克的Clojurist Java指南

班级

一个类是一堆方法(作用在该类上的函数),它们也可以是数据类型:例如,创建一个类型为的新类Double(Double. 1.2)它初始化类Double(句号是调用类构造函数的语法糖)方法,这些方法使用value提供的值初始化类1.2

现在,查看Java 6 API 中的Double类:

Double

public Double(double value)

Constructs a newly allocated Double object that represents the 
primitive double argument.

Parameters:
value - the value to be represented by the Double.

这样您就可以看到那里发生了什么。您Double用value “构建”了一个新值1.2,它是double
值。有点令人困惑,但实际上Double是一个代表Double的类,可以做与double有关的事情。

静态方法

例如,要从字符串中解析Double值,我们可以使用static方法(这意味着我们不需要的特定实例Double,我们可以像调用一样调用它sqrtparseDouble(String s)

(Double/parseDouble "1.2") => 1.2

不要在那里棘手。

非静态方法

假设我们要使用初始化为某种东西的Java类。不太困难:

(-> (String. "Hey there") ;; make a new String object
    (.toUpperCase)) ;; pass it to .toUpperCase (look up -> to see what it does)
                    ;; toUpperCase is a non-static method

=> "HEY THERE"

因此,现在我们使用的方法不是静态的,并且需要一个真实的活动String对象来处理。让我们看看文档是如何工作的:

toUpperCase

public String toUpperCase()

Converts all of the characters in this String to upper case using 
the rules of the default locale. This method is equivalent to
toUpperCase(Locale.getDefault()).

Returns:
the String, converted to uppercase.

因此,这里有一个返回字符串的方法(如定义中的public之后的“
String”所示,并且不带参数。但是,请稍等!它确实带参数。在Python中,它将是隐式参数self:这this在Java中称为。

我们还可以使用如下方法:(.toUpper (String. "Hey there"))并获得相同的结果。

更多方法

由于您使用Java处理可变数据和类,因此您需要能够将函数应用于类(实际上是类的实例),并且不要期望返回值。

例如,假设我们有一个处理JFramejavax.swing库。我们可能需要做一些事情 它,而不是 与它 (通常在操作
值,而不是 函数式语言它们)。我们可以这样:

(doto (JFrame. "My Frame!");; clever name
   (.setContentPane ... here we'd add a JPanel or something to the JFrame)
   (.pack) ;; this simply arranges the stuff in the frame–don't worry about it
   (.setVisibleTrue)) ;; this makes the Frame visible

doto只是将其第一个参数传递给您提供的所有其他函数,并将其作为第一个参数传递给它们。因此,这里我们只是在做很多事情
JFrame不会特别返回任何东西。所有这些方法JFrame在文档中都列为的方法(或其超类……暂时不用担心)。

包起来

这应该为您现在亲自探索JavaDocs做准备。在这里,您将找到标准Java
1.6安装中可用的所有内容。将会有新的概念,但是快速的Google搜索应该可以回答您的大多数问题,您总是可以在这里找到特定的问题。

一定要研究其他重要的Clojure函数,例如proxyreify以及extend- type及其朋友。我不经常使用它们,但是当我需要时,它们可能是无价的。实际上,我本人仍在理解它们。

那里有一吨,但这主要是数量而不是复杂性的问题。这不是一个坏问题。

补充阅读:

  • 静态还是非静态?;; 静态与非静态方法指南
  • Java类库;概述了那里发生的事情,并提供了一张漂亮的照片
  • JavaDocs ;; 链接上方
  • Clojure Java Interop文档;; 从Clojure网站


 类似资料:
  • 问题内容: 编辑:适用于root,sudo是问题。参见下文。 我有一个带有自己的库的目录,例如我的Python库位于。 我已通过将以下行添加到所有用户(包括root)将此目录添加到 Python的PATH 中: 它适用于所有用户(包括root用户)。但这不适用于sudo。有什么办法可以使sudo使用吗? 编辑:更多信息: 我已经添加到sudoers文件像这样:。西特尔不起作用。 问题答案: 我的解

  • 问题内容: 我正在开发一个项目,该项目需要解析一些受保护的网页中的数据。为了获得对这些页面的访问权限,我必须克服SAML身份验证形式(Shibboleth)。是否有人能够在Android(Java)中实现此标准?我已经读过这个线程:Android的SAML客户端实现? 但这并不能给我一个很好的解决方案。实际上,我需要 获取某些受保护网页的数据 以便对其进行解析,而不是让用户看到此类网页的内容。因此

  • 问题内容: 有人知道iOS的Elasticsearch客户端库吗?如果它也是迅速写的,那将是一个好处。 elasticsearch的“客户端”部分显示了多个平台的多个库,但对于iOS没有任何显示,我觉得有人必须这样做吗? 干杯 问题答案: 我怀疑是否有人- 上次我检查时没有,并且有充分的理由。请记住,为了允许IOS客户端(或Android)使用客户端库连接到Elasticsearch,您必须打开集

  • 我编写了自己的用户控件,其中包含一个列表视图,并且其 ItemsSource 是设置运行时。我想从用户控件 xaml 设置我自己的 ListViewItem 样式,但我无法让它工作,无论如何,从 App.xaml 设置它完美无缺,所以我想知道为什么? 用户控件 xaml 如下所示: 我想应用的样式是这样的: 我知道当从用户控件本身执行样式时,不会应用该样式,因为在输出窗口中,我看到添加的每个Lis

  • 我正在通过boto3组织从主AWS帐户获取所有子帐户。代码运行良好。我可以得到子帐户列表。但是如果您再次运行我的AWS Lambda函数,那么它将无法获取子帐户。 获取以下错误: 20到30分钟后,我可以看到我的代码工作了一次又一次地引发上述异常。 我是由AWS网关AWS Lambda运行此代码的。 有什么想法吗? 代码:

  • 我有一个连接到WebSocket服务器并从服务器接收消息的微服务。我想在这个应用程序中集成Sleuth,因为这是我的一组微服务的网关。但是当我连接到WebSocket服务器并开始接收消息时,我无法在日志中跟踪ID,spanid。我期待着这样的事情: 但我得到了: 我的代码如下: 我们的pom条目包括: