π¦ chap3. λλ€ ννμ
3.1 λλ€λ 무μμΈκ°?
λλ€ ννμμ λ©μλλ‘ μ λ¬ν μ μλ μ΅λͺ ν¨μλ₯Ό λ¨μνν κ²μ΄λ€.
μ΄λ¦μ μμ§λ§, νλΌλ―Έν° 리μ€νΈ, λ°λ, λ°ν νμ, λ°μν μ μλ μμΈ λ¦¬μ€νΈλ κ°μ§ μ μλ€.
- μ΅λͺ : μ΄λ¦μ΄ μκΈ° λλ¬Έμ μ΅λͺ μ΄λ€.
- ν¨μ : νΉμ ν΄λμ€μ μ’ μλμ§ μκΈ° λλ¬Έμ λ©μλκ° μλ ν¨μλΌκ³ λΆλ₯Έλ€.
- μ λ¬ : λλ€ ννμμ μΈμλ‘ μ λ¬νκ±°λ λ³μλ‘ μ μ₯ν μ μλ€.
- κ°κ²°μ± : μ΅λͺ ν΄λμ€μ²λΌ λ§μ μμ§κ΅¬λ ν μ½λλ₯Ό ꡬνν νμκ° μλ€.
λλ€λ μΈ λΆλΆμΌλ‘ μ΄λ£¨μ΄μ§λ€
1
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
- νλΌλ―Έν° 리μ€νΈ :
(Apple a1, Apple a2)
- νμ΄ν :
->
νλΌλ―Έν° 리μ€νΈμ λ°λλ₯Ό ꡬλΆνλ€ - λλ€ λ°λ :
a1.getWeight().compareTo(a2.getWeight());
λ€μμ μλ° 8μμ μ§μνλ μ ν¨ν λλ€ ννμ 5κ°μ§μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
(String s) -> s.length()
(Apple a) -> a.getWeight() > 150
(int x, int y) -> {
System.out.println("Result:");
System.out.println(x + y);
}
() -> 42
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
μλ° μ€κ³μλ μ΄λ―Έ C#μ΄λ μ€μΉΌλΌ κ°μ λΉμ·ν κΈ°λ₯μ κ°μ§ λ€λ₯Έ μΈμ΄μ λΉμ·ν λ¬Έλ²μ μλ°μ μ μ©νκΈ°λ‘ νλ€.
λ€μμ ννμ μ€νμΌ λλ€μ΄λ€.
1
(parameters) -> expression
λ€μμ λΈλ‘ μ€νμΌ λλ€μ΄λ€.
1
(parameters) -> { statements; }
λ€μμ λλ€μ μ¬μ© μμμ΄λ€.
λΆλ¦¬μΈ ννμ | (List |
---|---|
κ°μ²΄ μμ± | () β new Apple(10) |
κ°μ²΄μμ μλΉ | (Apple a) β { System.out.println(a.getWeight()); } |
κ°μ²΄μμ μ ν/μΆμΆ | (String s) β s.length() |
λ κ°μ μ‘°ν© | (int a, int b) β a * b |
λ κ°μ²΄ λΉκ΅ | (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); |
3.2 μ΄λμ, μ΄λ»κ² λλ€λ₯Ό μ¬μ©ν κΉ?
3.2.1 ν¨μν μΈν°νμ΄μ€
2μ₯μμ λ§λ Predicate
λ°λ‘ Predicate
ν¨μν μΈν°νμ΄μ€λ μ νν νλμ μΆμ λ©μλλ₯Ό μ§μ νλ μΈν°νμ΄μ€μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface Comparator<T> {
int compare(T o1, T o2);
}
public interface Runnable {
void run();
}
public interface ActionListener extends EventListener {
void actionPerformed(ActionEvent e);
}
public interface CallableV> {
V call() throws Exception;
}
public interface PrivilegedAction<T> {
T run();
}
λλ€ ννμμΌλ‘ ν¨μν μΈν°νμ΄μ€μ μΆμ λ©μλ ꡬνμ μ§μ μ λ¬ν μ μλ€.
μ¦ μ 체 ννμμ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ‘ μ·¨κΈν μ μλ€.
3.2.2 ν¨μ λμ€ν¬λ¦½ν°
ν¨μν μΈν°νμ΄μ€μ μΆμ λ©μλ μκ·Έλμ²λ λλ€ ννμμ μκ·Έλμ²λ₯Ό κ°λ¦¬ν¨λ€.
λλ€ ννμμ μκ·Έλμ²λ₯Ό μμ νλ λ©μλλ₯Ό ν¨μ λμ€ν¬λ¦½ν°λΌκ³ λΆλ₯Έλ€.
@FunctionalInterface
λ 무μμΈκ°?
μ΄λ ν¨μν μΈν°νμ΄μ€μμ κ°λ¦¬ν€λ μ΄λ Έν μ΄μ μ΄λ€.
μ΄λ₯Ό μ΄μ©νμ¬ μΈν°νμ΄μ€λ₯Ό μ μΈνμ§λ§ μ€μ λ‘ ν¨μν μΈν°νμ΄μ€κ° μλλΌλ©΄ μ»΄νμΌ μλ¬λ₯Ό λ°μμν¨λ€.
μ΄ μ΄λ Έν μ΄μ μ΄ μλ μΈν°νμ΄μ€λ μΆμ λ©μλκ° λ¨ νκ° μ¬μΌ νλ€.
3.3 λλ€ νμ© : μ€ν μ΄λΌμ΄λ ν¨ν΄
DB νμΌ μ²λ¦¬μ κ°μ μμ μ²λ¦¬λ μν ν¨ν΄μΌλ‘ μμμ μ΄κ³ μ²λ¦¬ν λ€μ μμμ λ«λ μμλ‘ μ΄λ£¨μ΄μ§λ€.
μ¦ μ€μ μμμ μ²λ¦¬νλ μ½λλ₯Ό μ€μ κ³Ό μ 리 λ κ³Όμ μ΄ λλ¬μΈλ ννμ΄λ€.
μ΄λ₯Ό μ€ν μ΄λΌμ΄λ ν¨ν΄(Execute Around Pattern) μ΄λΌκ³ λΆλ₯Έλ€.
1
2
3
4
5
public String processFile() throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
return br.readline();
}
}
3.3.1 1λ¨κ³ : λμ νλΌλ―Έν°νλ₯Ό κΈ°μ΅νλΌ
νμ¬ μ½λλ ν λ²μ ν μ€λ§ μ½μ μ μλ€.
κΈ°μ‘΄μ μ€μ , μ 리 κ³Όμ μ μ¬μ¬μ©νκ³ λ΄λΆ λ©μλλ§ λ€λ₯Έ λμμ μννλλ‘ νλ €λ©΄?
processFile μ λμμ νλΌλ―Έν°ννλ©΄ λλ€.
λλ€λ₯Ό μ΄μ©νλ©΄ λ©μλμ λμμ μ λ¬ν μ μλ€.
λ§μ½ ν λ²μ λ νμ μ½κ² λ§λλ €λ©΄?
1
String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());
3.3.2 2λ¨κ³ : ν¨μν μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ λμ μ λ¬
ν¨μν μΈν°νμ΄μ€ μ리μ λλ€λ₯Ό μ¬μ©ν μ μλ€.
1
2
3
4
@FunctionalInterface
public interface BufferedReaderProcessor {
String process(BufferedReader b) throws IOException;
}
1
2
3
public String processFile(BufferedReaderProcessor p) throws IOException {
}
3.3.3 3λ¨κ³ : λμ μ€ν
λλ€ ννμμΌλ‘ ν¨μν μΈν°νμ΄μ€μ μΆμ λ©μλ ꡬνμ μ§μ μ λ¬ν μ μμΌλ©° μ λ¬λ μ½λλ ν¨μν μΈν°νμ΄μ€μ μΈμ€ν΄μ€λ‘ μ λ¬λ μ½λμ κ°μ λ°©μμΌλ‘ μ²λ¦¬νλ€.
1
2
3
4
5
public String processFile(BufferedReaderProcessor p) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
return p.process(br);
}
}
3.3.4 4λ¨κ³ : λλ€ μ λ¬
λ€μμ ν νμ μ²λ¦¬νλ μ½λμ΄λ€.
1
String oneLine = processFile((BufferedReader br) -> br.readLine());
λ€μμ λ νμ μ²λ¦¬νλ μ½λμ΄λ€.
1
String oneLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
3.4 ν¨μν μΈν°νμ΄μ€ μ¬μ©
ν¨μν μΈν°νμ΄μ€μ μΆμ λ©μλ μκ·Έλμ²λ₯Ό ν¨μ λμ€ν¬λ¦½ν°λΌκ³ νλ€.
λ€μν λλ€ ννμμ μ¬μ©νλ €λ©΄ 곡ν΅μ ν¨μ λμ€ν¬λ¦½ν°λ₯Ό κΈ°μ νλ ν¨μν μΈν°νμ΄μ€ μ§ν©μ΄ νμνλ€.
μ΄λ―Έ μλ° API λ Comparable, Runnable, Callable λ±μ λ€μν ν¨μν μΈν°νμ΄μ€λ₯Ό ν¬ν¨νλ€.
μλ° 8μμλ java.util.function
ν¨ν€μ§μ μ¬λ¬ μλ‘μ΄ ν¨μν μΈν°νμ΄μ€λ₯Ό μ 곡νλ€.
3.4.1 Predicate
java.util.function.Predicate<T>
μΈν°νμ΄μ€λ test λΌλ μΆμ λ©μλλ₯Ό μ μνκ³
T νμμ κ°μ²΄λ₯Ό μΈμλ‘ λ°μ boolean μ λ°ννλ€.
1
2
3
4
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
3.4.2 Consumer
java.util.function.Predicate<T>
μΈν°νμ΄μ€λ T κ°μ²΄λ₯Ό λ°μμ void λ₯Ό λ°ννλ accept λΌλ μΆμ λ©μλλ₯Ό μ μνλ€.
1
2
3
4
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
3.4.3 Function
java.util.function.Function<T, R>
μΈν°νμ΄μ€λ T κ°μ²΄λ₯Ό λ°μμ R κ°μ²΄λ₯Ό λ₯Ό λ°ννλ apply λΌλ μΆμ λ©μλλ₯Ό μ μνλ€.
μ λ ₯μ μΆλ ₯μΌλ‘ 맀ννλ λλ€λ₯Ό μ μν λ νμ©ν μ μλ€.
1
2
3
4
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
μ λ€λ¦ νλΌλ―Έν°λ μ°Έμ‘°ν(Reference Type) λ§ μ¬μ©ν μ μλ€.
μλ°μμλ κΈ°λ³Ένκ³Ό μ°Έμ‘°νμ λ³ννλ λ°μ±, μΈλ°μ±μ μ§μνλ€.
μ΄ λμμ΄ μλμΌλ‘ μ΄λ£¨μ΄μ§λ μ€ν λ°μ±μ΄λΌλ κΈ°λ₯λ μ§μνλ€.
νμ§λ§ μ΄λ° λ³ν κ³Όμ μ λΉμ©μ΄ μλͺ¨λλ€.
λ°μ±ν κ°μ κΈ°λ³Ένμ κ°μΈλ Wrapper μ΄κ³ νμ μ μ₯λλ€.
μλ° 8μμλ κΈ°λ³Ένμ μ μΆλ ₯μΌλ‘ μ¬μ©νλ μν©μμ μ€ν λ°μ± λμμ νΌν μ μλλ‘ νΉλ³ν ν¨μν μΈν°νμ΄μ€λ₯Ό μ 곡νλ€.
λ€μ μμ μμ IntPredicate
λ 1000 μ΄λΌλ κ°μ λ°μ±νμ§ μμ§λ§, Predicate
1
2
3
4
5
6
7
8
9
public interface IntPredicate {
boolean test(int t);
}
IntPredicate evenNubmers = (int i) -> i % 2 == 0;
evenNumbers.test(1000);
Predicate<Integer> oddNumbers = (Integer i) -> i % 2 != 0;
oddNumbers.test(1000);
ν¨μν μΈν°νμ΄μ€λ νμΈλ μμΈ (Checked Exception)μ λμ§λ λμμ νμ©νμ§ μλλ€.
μ¦ μμΈλ₯Ό λμ§λ λλ€ ννμμ λ§λ€λ €λ©΄ νμΈλ μμΈλ₯Ό μ μΈνλ ν¨μν μΈν°νμ΄μ€λ₯Ό μ§μ μ μνκ±°λ λλ€λ₯Ό try/catch
λΈλ‘μΌλ‘ κ°μΈμΌ νλ€.
μλ₯Ό λ€μ΄ Function<T, R> νμμ ν¨μν μΈν°νμ΄μ€λ₯Ό κΈ°λνλ APIλ₯Ό μ¬μ©νκ³ μμ΄ μ§μ ν¨μν μΈν°νμ΄μ€λ₯Ό λ§λ€κΈ° μ΄λ ΅λ€λ©΄,
1
2
3
4
5
6
7
Function<BufferedReader, String> f = (BufferedReader b) -> {
try {
return b.readLine();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
λΉκ²μ¬ μμΈλ‘ μ ννμ¬μΌ νλ€.
3.5 νμ κ²μ¬, νμ μΆλ‘ , μ μ½
λλ€ ννμμ λ μ λλ‘ μ΄ν΄νλ €λ©΄ λλ€μ μ€μ νμμ νμ ν΄μΌ νλ€.
3.5.1 νμ κ²μ¬
λλ€κ° μ¬μ©λλ context λ₯Ό μ΄μ©ν΄μ λλ€μ type μ μΆλ‘ ν μ μλ€.
μ΄λ€ context μμ κΈ°λλλ λλ€ ννμμ νμμ λμ νμ(target type)μ΄λΌκ³ λΆλ₯Έλ€.
3.5.2 κ°μ λλ€, λ€λ₯Έ ν¨μν μΈν°νμ΄μ€
λμ νμμ΄λΌλ νΉμ§μΌλ‘ κ°μ λλ€ ννμμ΄λΌλ νΈνλλ μΆμ λ©μλλ₯Ό κ°μ§ λ€λ₯Έ ν¨μν μΈν°νμ΄μ€λ‘ μ¬μ©λ μ μλ€.
λ€μ λ ν λΉλ¬Έμ λͺ¨λ μ ν¨νλ€.
1
2
Callable<Integer> c = () -> 42;
PrivilegedAction<Integer> p = () -> 42;
3.5.3 νμ μΆλ‘
μλ° μ»΄νμΌλ¬λ λμ νμμ μ΄μ©ν΄μ ν¨μ λμ€ν¬λ¦½ν°λ₯Ό μ μ μκΈ° λλ¬Έμ μ»΄νμΌλ¬κ° λλ€μ μκ·Έλμ²λ μΆλ‘ ν μ μλ€.
μ»΄νμΌλ¬κ° λλ€ ννμμ νλΌλ―Έν° νμ μ μ κ·Όν μ μκΈ° λλ¬Έμ λλ€ λ¬Έλ²μμλ μ΄λ₯Ό μλ΅ν μ μλ€.
1
List<Apple> greenApples = filter(inventory, apple -> GREEN.equals(apple.getColor()));
1
2
3
4
5
6
7
// νμ μΆλ‘ x
Comparator<Apple> c =
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
// νμ μΆλ‘
Comparator<Apple> c =
(a1, a2) -> a1.getWeight().compareTo(a2.getWeight());
3.5.4 μ§μ λ³μ μ¬μ©
λλ€ ννμμμλ μ΅λͺ ν¨μμ²λΌ μμ λ³μλ₯Ό νμ©ν μ μκ³ μ΄λ₯Ό λλ€ μΊ‘μ²λ§μ΄λΌκ³ λΆλ₯Έλ€.
1
2
int portNumber = 1337;
Runnable r = () -> System.out.println(portNumber);
μ΄λ₯Ό μν΄μλ μ§μ λ³μλ λͺ μμ μΌλ‘ final λ‘ μ μΈλκ±°λ μ¬ν λΉμ΄ μ΄λ£¨μ΄μ§λ©΄ μλλ€.
λ€μμ μ»΄νμΌν μ μλ€.
1
2
3
int portNumber = 1337;
Runnable r = () -> System.out.println(portNumber);
portNumber = 31337;
μΈμ€ν΄μ€ λ³μλ νμ μ μ₯λλ λ°λ©΄ μ§μ λ³μλ μ€νμ μμΉνλ€.
κ·Έλ κΈ° λλ¬Έμ μλ° κ΅¬νμμλ μλ λ³μμ μ κ·Όμ νμ©νλκ² μλλΌ
μμ μ§μ λ³μμ 볡μ¬λ³Έμ μ 곡νλ€.
λ°λΌμ 볡μ¬λ³Έμ κ°μ΄ λ°λμ§ μμμΌ νλ€.
3.6 λ©μλ μ°Έμ‘°
λ©μλ μ°Έμ‘°λ₯Ό μ΄μ©νλ©΄ κΈ°μ‘΄μ λ©μλ μ μλ₯Ό μ¬νμ©ν΄μ λλ€μ²λΌ μ λ¬ν μ μλ€.
λ€μμ κΈ°μ‘΄ μ½λλ€.
1
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
λ€μμ λ©μλ μ°Έμ‘°μ java.util.Comparator.comparing
μ νμ©ν μ½λλ€.
1
inventory.sort(comparing(Apple::getWeight));
3.6.1 μμ½
λ©μλ μ°Έμ‘°λ νΉμ λ©μλλ§μ νΈμΆνλ λλ€μ μΆμ½νμ΄λΌ ν μ μλ€.
λ©μλ μ°Έμ‘°λ₯Ό μ΄μ©νλ©΄ κΈ°μ‘΄ λ©μλ ꡬνμΌλ‘ λλ€ ννμμ λ§λ€ μ μκ³ , λͺ μμ μΌλ‘ λ©μλλͺ μ μ°Έμ‘°ν¨μΌλ‘μ¨ κ°λ μ±μ λμΌ μ μλ€.
λ©μλ μ°Έμ‘°λ μΈ κ°μ§ μ νμΌλ‘ ꡬλΆν μ μλ€.
- μ μ λ©μλ μ°Έμ‘°
Integer μ parseInt λ Integer::parseInt λ‘ ννν μ μλ€.
- λ€μν νμμ μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
String μ length λ String::length λ‘ ννν μ μλ€.
- κΈ°μ‘΄ κ°μ²΄μ μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
Transaction κ°μ²΄λ₯Ό ν λΉλ°μ expensiveTransaction μ§μ λ³μ μΈμ€ν΄μ€μμ Transaction κ°μ²΄μ getValue λ©μλλ₯Ό νΈμΆνλ©΄ expensiveTransaction::getValue λ‘ ννν μ μλ€.
3.6.2 μμ±μ μ°Έμ‘°
ClassName::new μ²λΌ ν΄λμ€λͺ κ³Ό new ν€μλλ₯Ό μ΄μ©ν΄μ κΈ°μ‘΄ μμ±μμ μ°Έμ‘°λ₯Ό λ§λ€ μ μλ€.
μΈμκ° μλ μμ±μλ Supplier λ₯Ό μ΄μ©ν μ μλ€.
1
2
Supplier<Apple> c1 = Apple::new;
Apple a1 = c1.get();
Apple(Integer weight)
λΌλ μκ·Έλμ²λ₯Ό κ°λ μμ±μλ Function μ μ΄μ©ν μ μλ€.
1
2
Fuction<Integer, Apple> c1 = Apple::new;
Apple a2 = c2.apply(110);
Apple(String color, Integer weight
μ²λΌ λ μΈμλ₯Ό κ°λ μμ±μλ BiFunction μ μ΄μ©νλ€.
1
2
Fuction<Color, Integer, Apple> c1 = Apple::new;
Apple a2 = c2.apply(GREEN, 110);
μ΄λ₯Ό μ΄μ©νμ¬ Map μΌλ‘ μμ±μμ λ¬Έμμ΄κ°μ κ΄λ ¨μν€κ³ , String, Integer κ° μ£Όμ΄μ‘μ λ λ€μν 무κ²λ₯Ό κ°λ μ¬λ¬ μ’ λ₯μ κ³ΌμΌμ λ§λλ λ©μλλ₯Ό μ μν μ μλ€.
1
2
3
4
5
6
7
8
9
10
static Map<Sring, Function<Integer, Fruit>> map = new HashMap<>();
static {
map.put("apple", Apple::new);
map.put("orange", Orange::new);
}
public static Fruit giveMeFruit(String fruit, Integer weight) {
return map.get(fruit.toLowerCase()) // Function λ°ν
.apply(weight);
}
3.7 λλ€, λ©μλ μ°Έμ‘° νμ©νκΈ°
3.7.1 1λ¨κ³ : μ½λ μ λ¬
1
void sort(Comparator<? super E> c)
μ΄ μ½λλ Comparator κ°μ²΄λ₯Ό μΈμλ‘ λ°μ λ μ¬κ³Όλ₯Ό λΉκ΅νλ€.
κ°μ²΄ μμ λμμ ν¬ν¨μν€λ λ°©μμΌλ‘ μ΄μ sort μ λμμ νλΌλ―Έν°ν λμλ€κ³ ν μ μλ€.
1
2
3
4
5
6
public class AppleComparator implements Comparator<Apple> {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
}
inventory.sort(new AppleComparator());
3.7.2 2λ¨κ³ : μ΅λͺ ν΄λμ€ μ¬μ©
ν λ²λ§ μ¬μ©ν Comparator λ₯Ό ꡬννλ κ² λ³΄λ€λ μ΅λͺ ν΄λμ€λ₯Ό μ΄μ©νμ.
1
2
3
4
5
inventory.sort(new Comparator<Apple>() {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
}
3.7.3 3λ¨κ³ : λλ€ ννμ μ¬μ©
μλ° 8μμλ λλ€ ννμμ΄λΌλ κ²½λνλ λ¬Έλ²μ μ¬μ©ν΄ μ½λλ₯Ό μ λ¬ν μ μλ€.
ν¨μν μΈν°νμ΄μ€λ₯Ό κΈ°λνλ κ³³ μ΄λμμλ λλ€ ννμμ μ¬μ©ν μ μλ€.
1
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
μλ° μ»΄νμΌλ¬λ λλ€ ννμμ΄ μ¬μ©λ context λ₯Ό μ¬μ©ν΄μ λλ€μ νλΌλ―Έν° type μ μΆλ‘ νλ€.
1
inventory.sort((a1, a2) -> a1.getWeight().compareTo(a2.getWeight()));
Comparator λ Comparable ν€λ₯Ό μΆμΆν΄μ Comparator κ°μ²΄λ‘ λ§λλ Function<> μ μΈμλ‘ λ°λ μ μ λ©μλ comparing μ ν¬ν¨νλ€. μ΄λ₯Ό μ΄μ©ν΄ κ°λ μ±μ ν₯μνμ
1
2
3
import static java.util.Comparator.comparing;
inventory.sort(comparing(apple -> apple.getWeight()));
3.7.4 4λ¨κ³ : λ©μλ μ°Έμ‘° μ¬μ©
λ©μλ μ°Έμ‘°λ₯Ό μ΄μ©νλ©΄ λλ€ ννμμ μΈμλ₯Ό λ κΉλνκ² μ λ¬ν μ μλ€.
1
inventory.sort(comparing(Apple::getWeight));
3.8 λλ€ ννμμ μ‘°ν©ν μ μλ μ μ©ν λ©μλ
μλ° 8 APIμ λͺλͺ ν¨μν μΈν°νμ΄μ€λ λ€μν μ νΈλ¦¬ν° λ©μλλ₯Ό ν¬ν¨νλ€.
κ°λ¨ν μ¬λ¬ κ°μ λλ€ ννμμ μ‘°ν©νμ¬ λ³΅μ‘ν λλ€ ννμμ λ§λ€ μ μλ€.
ν¨μν μΈν°νμ΄μ€μμ μΆκ°λ‘ λ©μλλ₯Ό μ 곡νλ€λ κ² μμ²΄κ° ν¨μν μΈν°νμ΄μ€μ μ μμ μ΄κΈλλ κ²μΈλ° μ΄λ»κ² κ°λ₯ν κΉ?
λ°λ‘ λν΄νΈ λ©μλμ΄λ€.
3.8.1 Comparator μ‘°ν©
1
Comparator<Apple> c = Comparator.comparing(Apple::getWeight);
- μμ λ ¬
μ¬κ³Όμ 무κ²λ₯Ό λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬νκ³ μΆλ€λ©΄ reversed
λ₯Ό μ¬μ©νλ€
1
inventory.sort(comparing(Apple::getWeight).reversed());
- μ°κ²°
λΉκ΅ κ²°κ³Όλ₯Ό λ λ€λ¬μ μ μλ λ λ²μ§Έ Comparatorλ₯Ό λ§λ€ μ μλ€.
thenComparing
μ 첫 λ²μ§Έ λΉκ΅μμμ λ κ°μ²΄κ° κ°λ€κ³ νλ¨λλ©΄ λ λ²μ§Έ λΉκ΅μμ κ°μ²΄λ₯Ό μ λ¬νλ€.
1
2
3
inventory.sort(comparing(Apple::getWeight)
.reversed()
.thenComparing(Apple::getCountry));
3.8.2 Predicate μ‘°ν©
- λ°μ
νΉμ Predicate μ κ²°κ³Όλ₯Ό λ°μ μν¬ λ negate
λ₯Ό μ¬μ©νλ€.
1
Predicate<Apple> notRedApple = redApple.negate();
- and
λ λλ€λ₯Ό μ‘°ν©ν λ and
λ₯Ό μ¬μ©νλ€.
1
Predicate<Apple> redAndHeavyApple = redApple.and(apple -> apple.getWeight() > 150);
- or
λ λλ€λ₯Ό μ‘°ν©ν λ or
μ μ¬μ©νλ€.
1
2
3
Predicate<Apple> redAndHeavyAppleOrGreen =
redApple.and(apple -> apple.getWeight() > 150);
.or(apple -> GREEN.equals(a.getColor()));
3.8.3 Function μ‘°ν©
- andThen
μ£Όμ΄μ§ ν¨μλ₯Ό λ¨Όμ μ μ©ν κ²°κ³Όλ₯Ό λ€λ₯Έ ν¨μμ μ λ ₯μΌλ‘ μ λ¬νλ€.
1
2
3
4
Function<Integer, Integer> f = x -> x + 1;
Function<Integer, Integer> g = x -> x * 2;
Function<Integer, Integer> h = f.andThen(g); // μνμ μΌλ‘ g(f(x))
int result = h.apply(1); // 4λ₯Ό λ°ν
- compose
μΈμλ‘ μ£Όμ΄μ§ ν¨μλ₯Ό λ¨Όμ μ€ννκ³ μΈλΆ ν¨μμ κ²°κ³Όλ₯Ό μ λ¬νλ€.
1
2
3
4
Function<Integer, Integer> f = x -> x + 1;
Function<Integer, Integer> g = x -> x * 2;
Function<Integer, Integer> h = f.compose(g); // μνμ μΌλ‘ f(g(x))
int result = h.apply(1); // 3μ λ°ν