如何将此java代码更改为具有相同功能的clojure?

时间:2018-02-26 03:03:38

标签: java clojure

如何将此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次,但失败了

谢谢!

1 个答案:

答案 0 :(得分:2)

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

这是一个简短的片段:

(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满。

我建议过clojure basics并在4clojure练习,以内化Clojure的不同方法。