alex-dixon / from-java-to-clojure

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

From Java To Clojure

From Java To Clojure - Your Cheat Sheet For Java To Clojure


Java

System.out.print("Amit Shekhar");
System.out.println("Amit Shekhar");

Clojure

(prn "Amit Shekhar")
(println"Amit Shekhar")

Java

String name = "Amit Shekhar";
final String name = "Amit Shekhar";

Clojure

(def ^:private name "Amit Shekhar")
(def name "Amit Shekhar")

Java

String otherName;
otherName = null;

Clojure

(declare other-name)
(def other-name nil)

Java

if (text != null) {
  int length = text.length();
}

Clojure

(def length (if (nil? text) nil (count text)))

Java

String firstName = "Amit";
String lastName = "Shekhar";
String message = "My name is: " + firstName + " " + lastName;

Clojure

(def first-name "Amit")
(def last-name "Shekhar")
(def message (str "My name is : " first-name " " last-name))

Java

String text = "First Line\n" +
              "Second Line\n" +
              "Third Line";

Clojure

(def text 
  (str "First Line\n" 
       "Second Line\n" 
       "Third Line"))

Java

String text = x > 5 ? "x > 5" : "x <= 5";

String message = null;
log(message != null ? message : "");

Clojure

(def text
  (if (> x 5) 
    "x > 5" 
    "x <= 5"
(def message nil)
(if message (log message) (log ""))

java

final int andResult  = a & b;
final int orResult   = a | b;
final int xorResult  = a ^ b;
final int rightShift = a >> 2;
final int leftShift  = a << 2;

Clojure

(def and-result (bit-and a b))
(def or-result (bit-or a b)
(def xor-result (bit-xor a b)
(def right-shift (bit-shift-right a 2))
(def left-shift (bit-shift-left a 2))

Java

if (object instanceof Car) {
}
Car car = (Car) object;

Clojure

(if (= (type object) Car))

(def car (cast object Car)

Java

if (object instanceof Car) {
   Car car = (Car) object;
}

Clojure

; Honestly casting is really unusual in Clojure since it is dynamically typed and not object-oriented

Java

if (score >= 0 && score <= 300) { }

Clojure

(if (and (>= score 0) (<= score 300)))

Java

int score = // some score;
String grade;
switch (score) {
	case 10:
	case 9:
		grade = "Excellent";
		break;
	case 8:
	case 7:
	case 6:
		grade = "Good";
		break;
	case 5:
	case 4:
		grade = "Ok";
		break;
	case 3:
	case 2:
	case 1:
		grade = "Fail";
		break;
	default:
	    grade = "Fail";				
}

Clojure

(let [score nil]
  (cond
    (#{9 10} score) "Excellent"
    (>= 6 8 score) "Good"
    (#{4 5} score) "Ok"
    (>= 1 3 score) "Fail"
    :default "Fail"

Java

for (int i = 1; i <= 10 ; i++) { }

for (int i = 1; i < 10 ; i++) { }

for (int i = 10; i >= 0 ; i--) { }

for (int i = 1; i <= 10 ; i+=2) { }

for (int i = 10; i >= 0 ; i-=2) { }

for (String item : collection) { }

for (Map.Entry<String, String> entry: map.entrySet()) { }

Clojure

(repeatedly 10 some-fn)

(dotimes [x 9] 
  (some-fn x)

(loop [x 10]
  (when-not (= x 0)
    (recur (- x 2))

(doseq [x coll])

(doseq [[k v] map])

(for [x coll]))

(for [[k v] map]
  (somefunc k v))

(for [x ['a 'b 'c] 
      y [1 2 3]]
  (println x y)

Java

final List<Integer> listOfNumber = Arrays.asList(1, 2, 3, 4);

final Map<Integer, String> keyValue = new HashMap<Integer, String>();
map.put(1, "Amit");
map.put(2, "Ali");
map.put(3, "Mindorks");

// Java 9
final List<Integer> listOfNumber = List.of(1, 2, 3, 4);

final Map<Integer, String> keyValue = Map.of(1, "Amit",
                                             2, "Ali",
                                             3, "Mindorks");

Clojure

(def list-of-number [1 2 3 4])

(def key-value {1 "Amit" 
                2 "Ali" 
                3 "Mindorks"})

Java

// Java 7 and below
for (Car car : cars) {
  System.out.println(car.speed);
}

// Java 8+
cars.forEach(car -> System.out.println(car.speed));

// Java 7 and below
for (Car car : cars) {
  if (car.speed > 100) {
    System.out.println(car.speed);
  }
}

// Java 8+
cars.stream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed));

Clojure

(doseq [car cars]
  (println (:speed car)))

(map (comp println :speed)
  (filter #(> (:speed %) 100) cars))

Java

void doSomething() {
   // logic here
}

Clojure

(defn do-something []
  ; logic here)

Java

void doSomething(int... numbers) {
   // logic here
}

Clojure

(defn do-something [& xs]
  ; logic here)

Java

int getScore() {
   // logic here
   return score;
}

Clojure

(defn get-score []
  ; logic here
  score)

Java

int getScore(int value) {
    // logic here
    return 2 * value;
}

Clojure

(defn get-score [value] 
  ; logic here
  (* 2 value))

; as a partially applied function definition
(def get-score (partial * 2))

Java

public class Utils {

    private Utils() { 
      // This utility class is not publicly instantiable 
    }
    
    public static int getScore(int value) {
        return 2 * value;
    }
    
}

Clojure

(defn get-score [value] (* 2 value))

Java

public class Developer {

    private String name;
    private int age;

    public Developer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Developer developer = (Developer) o;

        if (age != developer.age) return false;
        return name != null ? name.equals(developer.name) : developer.name == null;

    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "Developer{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

Clojure

(defrecord Developer [name age])

Java

public class Developer implements Cloneable {

    private String name;
    private int age;

    public Developer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return (Developer)super.clone();
    }
}

// cloning or copying 
Developer dev = new Developer("Max", 30);
try {
     Developer dev2 = (Developer) dev.clone();
} catch (CloneNotSupportedException e) {
     // Handle Exception
}

Clojure

(defrecord Developer [name age])

// cloning or copying
(def dev (->Developer "Max" 30))
(def dev2 dev)
// in case you only want to copy selected properties
(def dev2 (map->Developer {:age 25})

Java

public class Utils {

    private Utils() { 
      // This utility class is not publicly instantiable 
    }
    
    public static int triple(int value) {
        return 3 * value;
    }
    
}

int result = Utils.triple(3);

Clojure

(defn triple [n] (* 3 n)

(def result (triple 3))

Java

ImageView imageView;

Clojure

(ImageView.)

Important things to know in Clojure

  • Functions
  • Data structures
  • Immutability
  • Connecting your editor to a REPL
  • Java interop
  • Clojurescript
  • Namespaces
  • deftype, definterface, defrecord for object-oriented programming
  • Atoms and binding for thread-safe mutability
  • clojure.spec

About