【问题标题】:How to change this java code to clojure with same function?如何将此java代码更改为具有相同功能的clojure?
【发布时间】:2018-02-26 03:03:38
【问题描述】:

如何把这段java代码改成clojure?让clojure代码做同样的事情?

B.java:

package b;

public class B {
 int c;
}

A.java:

package b;

import java.util.*;

public class A {

 public static void findElement(List<B> a)
 {
    a.forEach((z) -> {
        if (z.c == 1) {
            System.out.println(z.c);
        }
    });
 }
 public static void main(String[] args) {
    // TODO Auto-generated method stub
    B x = new B();
    x.c = 1;
    B y = new B();
    y.c = 2;
    List<B> d = new ArrayList<B>();
    d.add(x);
    d.add(y);
    findElement(d);
 }
}

我曾尝试使用 defrecord 和 defprotocol 时间,但失败了

谢谢!

【问题讨论】:

  • 还请添加您尝试过的内容 - 它可以让您更深入地了解您真正追求的内容,并且可能有助于编写更好的答案(如果仅用于复制和粘贴一些代码)。还有这里的目标是什么?类中的代码看起来很随机,基本上是 clojure 中的单行代码。你在关注:gen-class相关的事情吗?

标签: java clojure


【解决方案1】:

您在示例中使用了很多突变。 Clojure 是一种高度鼓励不变性的语言。

这是一个简短的 sn-p:

(defrecord B [c])

(defn find-element [bs]
  (filter #(= (:c %) 1) bs))

(let [x (->B 1)
      y (->B 2)
      d [x y]
      r (find-element d)]
  (doseq [i r]
    (println (:c i)))) 

但是,我们不是打印find-element 中的元素,而是返回找到的结果并将它们存储在r 中。稍后我们使用doseq 来检查每个项目以打印它。

在 Clojure 中,这不是一种非常惯用的思考方式,我不确定您要达到什么目的,但这有点臃肿且 OO-full。

我建议您查看 clojure basics 并在 4clojure 上练习以内化 Clojure 的不同方法。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多