item 42 leekyunghee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- μλ°μμ ν¨μ νμ μ ννν λ μΆμ λ©μλλ₯Ό νλλ§ λ΄μ μΈν°νμ΄μ€(λλ¬Όκ²λ μΆμ ν΄λμ€)λ₯Ό μ¬μ©νλ€.
- λλ€λ ν¨μλ μ΅λͺ ν΄λμ€μ κ°λ μ λΉμ·νμ§λ§ ν¨μ¬ κ°κ²°νλ€.
- μ΄λ° μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό ν¨μ κ°μ²΄λΌκ³ νμ¬ νΉμ ν¨μλ λμμ λνλ΄λ λ° μΌλ€.
λ¬Έμμ΄μ κΈΈμ΄μμΌλ‘ μ λ ¬νλλ° μ λ ¬μ μν λΉκ΅ ν¨μλ‘ μ΅λͺ ν΄λμ€λ₯Ό μ¬μ©νλ€.
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static java.util.Comparator.*;
import static java.util.Comparator.comparingInt;
// ν¨μ κ°μ²΄λ‘ μ λ ¬νκΈ° (254-255μͺ½)
public class SortFourWays {
public static void main(String[] args) {
List<String> words = Arrays.asList(args);
// μ½λ 42-1 μ΅λͺ
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό ν¨μ κ°μ²΄λ‘ μ¬μ© - λ‘μ κΈ°λ²μ΄λ€! (254μͺ½)
// Comparator μΈν°νμ΄μ€κ° μ λ ¬μ λ΄λΉνλ μΆμ μ λ΅μ λ»νλ©° λ¬Έμμ΄μ μ λ ¬νλ ꡬ체μ μΈ μ λ΅μ μ΅λͺ
ν΄λμ€λ‘ ꡬν
Collections.sort(words, new Comparator<String>() {
public int compare(String s1, String s2) {
return Integer.compare(s1.length(), s2.length());
}
});
System.out.println(words);
Collections.shuffle(words);
// μ½λ 42-2 λλ€μμ ν¨μ κ°μ²΄λ‘ μ¬μ© - μ΅λͺ
ν΄λμ€ λ체
Collections.sort(words,
(s1, s2) -> Integer.compare(s1.length(), s2.length()));
System.out.println(words);
Collections.shuffle(words);
// λλ€ μ리μ λΉκ΅μ μμ± λ©μλ(λ©μλ μ°Έμ‘°μ ν¨κ»)λ₯Ό μ¬μ©
Collections.sort(words, comparingInt(String::length));
System.out.println(words);
Collections.shuffle(words);
// λΉκ΅μ μμ± λ©μλμ ListμΈν°νμ΄μ€μ μΆκ°λ sort λ©μλλ₯Ό μ¬μ©
words.sort(comparingInt(String::length));
System.out.println(words);
}
}- μ΅λͺ ν΄λμ€ λ°©μμ μ½λκ° λ무 κΈΈκΈ° λλ¬Έμ ν¨μν νλ‘κ·Έλλ°μ μ ν©νμ§ μμ
- μλ° 8μμμ μΆμ λ©μλ νλμ§λ¦¬ μΈν°νμ΄μ€λ νΉλ³ν μλ―Έλ₯Ό μΈμ λ°μ
- λλ€λ ν¨μλ μ΅λͺ ν΄λμ€μ κ°λ μ λΉμ·νμ§λ§ μ½λλ ν¨μ¬ κ°κ²°
νμ μ λͺ μν΄μΌ μ½λκ° λ λͺ νν λλ§ μ μΈνκ³ λ λλ€μ λͺ¨λ λ§€κ°λ³μ νμ μ μλ΅νμ.
- νμ μΆλ‘ κ·μΉ
- μν©μ λ°λΌ μ»΄νμΌλ¬κ° νμ μ κ²°μ νμ§ λͺ»ν μλ μλλ° κ·Έλ΄ λλ νλ‘κ·Έλλ¨Έκ° μ§μ λͺ μν΄μΌ νλ€.
λλ€λ₯Ό μ΄μ©νλ©΄ μ΄κ±° νμ μ μΈμ€ν΄μ€ νλλ₯Ό μ΄μ©νλ λ°©μμΌλ‘ μμλ³λ‘ λ€λ₯΄κ² λμνλ μ½λλ₯Ό μ½κ² ꡬνν μ μλ€
- λ¨μν κ° μ΄κ±° νμ μμμ λμμ λλ€λ‘ ꡬνν΄ μμ±μμ λκΈ°κ³ μμ±μλ μ΄ λλ€λ₯Ό μΈμ€ν΄μ€ νλλ‘ μ μ₯ν΄ λλ€.
- apply λ©μλμμ νλμ μ μ₯λ λλ€λ₯Ό νΈμΆνκΈ°λ§ νλ©΄ λλ€.
μ΄κ±° νμ μμμ λμμ ννν λλ€λ₯Ό DoubleBinaryOperator μΈν°νμ΄μ€ λ³μμ ν λΉνλ€. Double νμ μΈμ 2κ°λ₯Ό λ°μ Double νμ κ²°κ³Όλ₯Ό λλ €μ€λ€.
import java.util.function.DoubleBinaryOperator;
// μ½λ 42-4 ν¨μ κ°μ²΄(λλ€)λ₯Ό μΈμ€ν΄μ€ νλμ μ μ₯ν΄ μμλ³ λμμ ꡬνν μ΄κ±° νμ
public enum Operation {
PLUS ("+", (x, y) -> x + y),
MINUS ("-", (x, y) -> x - y),
TIMES ("*", (x, y) -> x * y),
DIVIDE("/", (x, y) -> x / y);
private final String symbol;
private final DoubleBinaryOperator op;
Operation(String symbol, DoubleBinaryOperator op) {
this.symbol = symbol;
this.op = op;
}
@Override public String toString() { return symbol; }
public double apply(double x, double y) {
return op.applyAsDouble(x, y);
}
// μμ΄ν
34μ λ©μΈ λ©μλ (215μͺ½)
public static void main(String[] args) {
double x = Double.parseDouble(args[0]);
double y = Double.parseDouble(args[1]);
for (Operation op : Operation.values())
System.out.printf("%f %s %f = %f%n",
x, op, y, op.apply(x, y));
}
}- μΆμ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€ λ λλ€λ₯Ό μΈ μ μμΌλ μ΅λͺ ν΄λμ€λ₯Ό μ¨μΌνλ€.
- μΆμ λ©μλκ° μ¬λ¬κ°μΈ μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€ λλ μ΅λͺ ν΄λμ€λ₯Ό μΈ μ μλ€.
λλ€λ μμ μ μ°Έμ‘°ν μ μλ€. λλ€μμμ this ν€μλλ λ°κΉ₯ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€.
μ΅λͺ ν΄λμ€μμ this λ μκΈ° μμ μ΄λ―λ‘ ν¨μ κ°μ²΄κ° μμ μ μ°Έμ‘°ν΄μΌ νλ€λ©΄ μ΅λͺ ν΄λμ€λ₯Ό μ¨μΌνλ€.
ν΅μ¬ μ 리
λλ€λ₯Ό μ§λ ¬ν(μ΅λͺ
ν΄λμ€μ μΈμ€ν΄μ€λ λ§μ°¬κ°μ§) νλ μΌμ κ·Ήν μΌκ°μΌ νλ€.
μ΅λͺ
ν΄λμ€λ (ν¨μν μΈν°νμ΄μ€κ° μλ) νμ
μ μΈμ€ν΄μ€λ₯Ό λ§λ€ λλ§ μ¬μ©νλΌ.
μ§λ ¬ν ν΄μΌνλ ν¨μ κ°μ²΄κ° μλ€λ©΄ Comparatorμ²λΌ private μ μ μ€μ²© ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ¬μ©νμ.