μλ° 8μμ ν¨μν μΈν°νμ΄μ€, λλ€, λ©μλ μ°Έμ‘°λΌλ κ°λ μ΄ μΆκ°λμλ€. (ν¨μ κ°μ²΄ μ½κ² μ¬μ©)
μ΄μ ν¨κ» μ€νΈλ¦Ό API μΆκ°λ‘ λ°μ΄ν° μμμ μνμ€ μ²λ¦¬λ₯Ό λΌμ΄λΈλ¬λ¦¬ μ°¨μμμ μ§μνκΈ° μμνλ€.
μμ΄ν 42 : μ΅λͺ ν΄λμ€λ³΄λ€λ λλ€λ₯Ό μ¬μ©νλΌ
- μμ μ μλ°μμ ν¨μ νμ νν ⇒ μΆμ λ©μλλ₯Ό νλλ§ λ΄μ μΈν°νμ΄μ€(or μΆμν΄λμ€) μ¬μ©
- JDK 1.1 λ±μ₯ ν ‘μ΅λͺ
ν΄λμ€'κ° ν¨μ κ°μ²΄λ₯Ό λ§λλ μ£Όμμλ¨
List<String> words = Arrays.asList(args); Collections.sort(words, new Comparator<String > () { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } });
- ‘μ΅λͺ ν΄λμ€λ μ½λκ° λ무 κΈΈμ΄ ν¨μν νλ‘κ·Έλλ°μ μ ν©νμ§ μμ’
μλ° 8μμ ‘μΆμλ©μλ νλμ μΈν°νμ΄μ€'λ νΉλ³νκ² μ¬μ©νκ² λμλ€. ⇒ ν¨μν μΈν°νμ΄μ€
ν¨μν μΈν°νμ΄μ€λ μΈμ€ν΄μ€λ₯Ό ‘λλ€μ'μ μ¬μ©ν΄ λ§λ€ μ μλ€. ⇒ κ°κ²°ν μ½λ
List<String> words = Arrays.asList(args);
Collections.sort(words,
(s1, s2) -> Integer.compare(s1.length(), s2.length()));
λλ€μ 맀κ°λ³μλ₯Ό μ΄ν΄λ³΄λ©΄ νμ μ΄ λͺ μλμ΄μμ§ μλ€. μ΄λ μ»΄νμΌλ¬κ° νμ μΆλ‘ μ ν΄μ€κ²μ΄λ€. (μν©μ λ°λΌ νμ λͺ μ νμ)
- νμ
μΆλ‘
- λ³΄ν΅ μ»΄νμΌλ¬λ νμ μ μΆλ‘ ν λ μ λ€λ¦μμ μ 보λ₯Ό μ»λλ€. λ§μ½ Listκ° λ‘νμ μ΄μλ€λ©΄ νμ μΆλ‘ μ μ€ν¨ν΄ μ»΄νμΌ μλ¬κ° λ°μνμ κ²μ΄λ€.
- λΉκ΅μ μμ± λ©μλ
- Collections.sort(words, comparingInt(String::length));
- μλ° 8μ μΆκ°λ sort λ©μλλͺ¨λ λΉκ΅μ μμ±λ©μλκ° λλ€μ μ리μ λ€μ΄κ°λ€.
- words.sort(comparingInt(String::length));
μ€μ©μ μ¬μ©
λλ€κ° μΆκ°λλ©΄μ ν¨μκ°μ²΄λ₯Ό μ€μ©μ μΌλ‘ μ¬μ©ν μ μκ² λμλ€.
λλ€λ₯Ό μ¬μ©νλ©΄ κ°λ§λ€ λ€λ₯΄κ² λμνλ μ½λλ₯Ό μ½κ² ꡬνν μ μλ€.(μ₯μ )
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));
}
}
μ μ½λλ symbolκ°μ μ μνκ³ DoubleBinaryOperatorλΌλ ν¨μν μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ½κ² λμμ ꡬνν΄μ μ£Όμ ν΄λμλ€. μ΄λ μμλ³ ν΄λμ€ λͺΈμ²΄ ꡬνλ³΄λ€ κ΅¬νμ νΈνμ§λ§ μ΄λ¦μ΄ μκ³ λ¬Έμνλ₯Ό νμ§ λͺ»νλ€.(λ¨μ )
λλ€ νκ³
- λλ€λ ν¨μν μΈν°νμ΄μ€μμλ§ μ°μΈλ€. μΆμ ν΄λμ€μμλ μ΅λͺ ν΄λμ€λ₯Ό μ¨μΌνλ€.
- λλ€λ μμ μ μ°Έμ‘°ν μ μλ€. (λλ€μ thisλ λ°κΉ₯ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν΄)
- λλ€λ₯Ό μ§λ ¬ννλ μΌμ κ·Ήν μΌκ°μ (ꡬνλ³ μ§λ ¬νκ° λ€λ₯Ό μ μλ€)
λλ€λ μλ°μμ ν¨μ κ°μ²΄λ₯Ό μ½κ² ννν μ μμ΄ μλ° ν¨μν νλ‘κ·Έλλ°μ μ§νμ μ΄μλ€.
μμ΄ν 43 : λλ€λ³΄λ€λ λ©μλ μ°Έμ‘°λ₯Ό μ¬μ©νλΌ
λλ€μ μ₯μ μ κ°κ²°ν¨!!
κ·Έ μ₯μ μ λμ± κ·Ήλν μν¨ κ²μ΄ λ°λ‘ ‘λ©μλ μ°Έμ‘°’
- νμ§λ§ μλ΅μ λ§μ΄ νλ―λ‘ μ μ νκ² μ¬μ©ν κ²
-ν΅μ¬μ 리-
λ©μλ μ°Έμ‘° μͺ½μ΄ μ§§κ³ λͺ ννλ€λ©΄ λ©μλ μ°Έμ‘°λ₯Ό μ°κ³ , κ·Έλ μ§ μμ λλ§ λλ€λ₯Ό μ¬μ©νλΌ
μμ΄ν 44 : νμ€ ν¨μν μΈν°νμ΄μ€λ₯Ό μ¬μ©νλΌ
μλ°μ λλ€ μ§μμΌλ‘ μΈν΄ API μμ± λͺ¨λ²μ¬λ‘λ λ³ννμλ€.
μμ ν΄λμ€ κΈ°λ³Έ λ©μλλ₯Ό μ¬μ μν΄ λμμ ꡬννλ ‘ν νλ¦Ώ λ©μλ ν¨ν΄'μ νλμ μΈ ν΄λ²μΌλ‘ ν¨μ κ°μ²΄λ₯Ό λ°λ μ μ ν©ν°λ¦¬λ μμ±μ μ 곡μΌλ‘ μ¬μ©ν μ μκ² λμλ€.
**‘ν¨μ κ°μ²΄'**λ₯Ό 맀κ°λ³μλ‘ λ°λ μμ±μλ λ©μλλ₯Ό λ μ¬μ©νκ² λμλ€.
μλ°λ λ€μν μΈμμ λ°νκ°μ μ§μνλ ‘νμ€ ν¨μν μΈν°νμ΄μ€'λ₯Ό μ 곡νλ€. (μ©λμ λ§λ€λ©΄ μ§μ ꡬννμ§λ§ κ³ μ¬μ©νλΌ)
νμ€ ν¨μν μΈν°νμ΄μ€ μμ
UnaryOperator<T> | T apply(T t) | String::toLowerCase |
BinaryOperator<T> | T apply(T t1, T t2) | BigInteger::add |
Predicate<T> | boolean test(T t) | Collection::isEmpty |
Function<T, R> | R apply(T t) | Arrays::asList |
Supplier<T> | T get() | Instant::now |
Consumer<T> | void accept(T t) | System.out::println |
μ μμ μΈμλ int, long, doubleμ©μΌλ‘ λ³νν IntPredicate(intλ₯Ό λ°μ μ°Έ/κ±°μ§ νλ¨) λ±μ λ³νμ΄ μκΈ΄λ€.
μΈμ 2κ°μ©μ λ°λ BiConsumer<T, U>μ κ°μ΄ λ³νμ΄ μκΈΈ μλ μλ€.
μ΄λ¬ν ν¨μν μΈν°νμ΄μ€λ λ¬΄λ € 43κ°λ λλ€. λͺ¨λ μΈμΈ νμλ μμ§λ§ μμ£Ό μ°λ ν¨ν΄μ κΈ°μ΅ν΄λμ.
- νμ€ ν¨μν μΈν°νμ΄μ€λ κΈ°λ³Έ νμ λ§ μ§μνλ―λ‘ λ°μ± νμ μ λ£μ΄ μ±λ₯μ μ νμν€μ§ λ§μ
-μ§μ μμ±μ΄ νμν κ²½μ°-
- νμ€ ν¨μν μΈν°νμ΄μ€μ μ©λκ° λ§λ κ² μμ λ μλ₯Ό λ€μ΄ 맀κ°λ³μ 3κ° λλ κ²μ¬ μμΈλ₯Ό λμ§λ κ²½μ°
- Comparator<T> κ°μ κ²½μ°
- μμ£Ό μ°μ΄λ©°, μ΄λ¦ μμ²΄κ° μ©λλ₯Ό λͺ νν μ€λͺ νλ κ²½μ°
- λ°λμ λ°λΌμΌ νλ κ·μ½μ΄ μλ κ²½μ°
- μ μ©ν λν΄νΈ λ©μλλ₯Ό μ 곡ν μ μλ κ²½μ°
μ§μ μμ±ν ν¨μν μΈν°νμ΄μ€μλ ‘@FunctionalInterface’ μ λν μ΄μ μ΄ λ¬λ € μκ³ μ¬μ©ν΄μΌλ§ νλ€.
μ΄λ₯Ό μ¬μ©νλ μ΄μ λ ‘@Override’ μ¬μ©μ΄μ μ λΉμ·νλ€.
- μ΄λ₯Ό μ¬μ©νλ μ΄μκ² μΈν°νμ΄μ€κ° λλ€μ©μΌλ‘ μ€κ³λ κ²μμ μλ¦Ό
- ν΄λΉ μΈν°νμ΄μ€κ° μΆμλ©μλλ₯Ό μ€μ§ νλλ§ κ°μ§κ³ μμ λ μ»΄νμΌ λκ²ν¨
- 2λ²μ ν΅ν΄ λκ΅°κ° μ€μλ‘ λ©μλλ₯Ό μΆκ°νμ§ λͺ»νκ² λ§μ μ μμ
-ν΅μ¬ μ 리-
μλ°λ λλ€λ₯Ό μ§μνλ μ΄μ API μ€κ³μ μ λ ₯κ°κ³Ό λ°νκ°μ ν¨μν μΈν°νμ΄μ€ νμ μ νμ©νλΌ. (νμ€ ν¨μν μΈν°νμ΄μ€ or μ§μ ꡬνν μΈν°νμ΄μ€)
μμ΄ν 45 : μ€νΈλ¦Όμ μ£Όμν΄μ μ¬μ©νλΌ
μ€νΈλ¦Όμ λ€λμ λ°μ΄ν° μ²λ¦¬μμ μ λκ³ μ μλ° 8μ μΆκ°λμλ€.
μ€νΈλ¦Ό νμ΄νλΌμΈμ μ€κ°μ°μ° νμ μ’ λ¨ μ°μ°μΌλ‘ λλλ€. λν μ§μ° νκ°κ° λμ΄ νκ°λ μ’ λ¨ μ°μ°μ΄ νΈμΆλ λ μ΄λ€μ§λ€.
μ€νΈλ¦Όμ κ³Όνκ² μ¬μ©νλ©΄ νλ‘κ·Έλ¨ μ μ²΄κ° λ¨ νμ€μλ ννλ μ μμ§λ§ λμ κ±°μ λλΆλΆ μ¬λλ€μ΄ μ½λλ₯Ό μ΄ν΄νκΈ° μ΄λ €μμ§λ€. ⇒ μ€νΈλ¦Όμ΄ κ³Όνλ©΄ μ½κ±°λ μ μ§λ³΄μ€κ° νλ νλ‘κ·Έλ¨μ΄ λλ€.
λ°λΌμ, κΈ°μ‘΄ μ½λλ μ€νΈλ¦Όμ μ¬μ©νλλ‘ λ¦¬ν©ν λ§ νλ, μ μ½λκ° λμ λ³΄μΌ λλ§ λ°μνμ.
μ€κ° μ°μ°μΌλ‘ μ¬μ©ν flatMapμ μ€νΈλ¦Όμ μμ κ°κ°μ νλμ μ€νΈλ¦ΌμΌλ‘ 맀νν λ€μ λ€μ κ·Έ μ€νΈλ¦Όμ νλμ μ€νΈλ¦ΌμΌλ‘ ν©μΉλ€. (μ€μ²© λλ€ μ¬μ©)
// μ½λ 45-5 λ°μΉ΄λ₯΄νΈ κ³± κ³μ°μ μ€νΈλ¦Ό λ°©μμΌλ‘ ꡬν (276μͺ½)
private static List<Card> newDeck() {
return Stream.of(Suit.values())
.flatMap(suit ->
Stream.of(Rank.values())
.map(rank -> new Card(suit, rank)))
.collect(toList());
}
μμ΄ν 46 : μ€νΈλ¦Όμμλ λΆμμ© μλ ν¨μλ₯Ό μ¬μ©νλΌ
μ€νΈλ¦Όμ ν΅μ¬μ κ³μ°μ μΌλ ¨μ λ³νμΌλ‘ μ¬κ΅¬μ±νλ κ²μ΄λ€.
- κ° λ³ν λ¨κ³λ μ΄μ λ¨κ³μ κ²°κ³Όλ₯Ό λ°μ μ²λ¦¬νλ μμ ν¨μ
- μμν¨μ : μ€μ§ μ λ ₯λ§μ΄ κ²°κ³Όμ μν₯μ μ£Όλ ν¨μ
forEachλ μ€νΈλ¦Ό κ³μ° κ²°κ³Όλ₯Ό λ³΄κ³ ν λλ§ μ¬μ©νκ³ κ³μ°νλ λ°μλ μ°μ§λ§μ.
μ€νΈλ¦Όμ μ¬λ°λ₯΄κ² μ¬μ©νλ €λ©΄ Collectorλ₯Ό μμλ¬μΌνλ€.
- toList, toSet, toMap, groupingBy, joining ..etc
p.277 μμλ€μ μμ£Ό 보며 μ΅νμ.
μμ΄ν 47 : λ°ν νμ μΌλ‘λ μ€νΈλ¦Όλ³΄λ€ 컬λ μ μ΄ λ«λ€
λ°ν νμ μΌλ‘ μ€νΈλ¦Όλ³΄λ€ 컬λ μ μΈν°νμ΄μ€λ₯Ό μ΄λ€.
μμ μνμ€λ₯Ό λ°ννλ κ³΅κ° APIμ λ°ν νμ μλ Collectionμ΄λ κ·Έ νμ νμ μ μ°λ κ² μΌλ°μ μΌλ‘ μ΅μ μ΄λ€.
- Collection μΈν°νμλ Iterableμ νμ νμ μ΄κ³ , stream λ©μλλ μ 곡νλ€.
- νμ§λ§, λ¨μ§ 컬λ μ μ λ°ννλ€λ μ΄μ λ‘ λ©μΉ ν° μνμ€λ₯Ό λ©λͺ¨λ¦¬μ μ¬λ €μλ μλλ€.
컬λ μ μ λ°ννλ κ² λΆκ°λ₯νλ©΄ μ€νΈλ¦Όκ³Ό Iterable μ€ λ μμ°μ€λ¬μ΄ κ²μ λ°ννλΌ
μμ΄ν 48 : μ€νΈλ¦Ό λ³λ ¬νλ μ£Όμν΄μ μ μ©νλΌ
λμμ± νλ‘κ·Έλ¨μ μ¬λ°λ₯΄κ² μμ±νλ κ²μ λ§€μ° μ΄λ ΅λ€. λ³λ ¬ μ€νΈλ¦Ό νμ΄νλΌμΈ νλ‘κ·Έλλ°μμλ μ΄λ λ€λ₯Όλ°κ° μλ€.
μ€νΈλ¦Όμ μλͺ» λ³λ ¬ννλ©΄ μ±λ₯μ΄ λλΉ μ§κ±°λ μμμΉ λͺ»ν κ²°κ³Όλ λμμ΄ λ°μν μ μλ€.
μ λ§ μ‘°κ±΄λ§ μ μ§μΌμ§λ©΄ parallelλ©μλ νΈμΆ νλλ‘ μμ²λ μ±λ₯ ν₯μμ μ»μ μ μκΈ΄ νλ€.
'πμ½μ μ± μ 리 > μ΄νν°λΈμλ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ΄νν°λΈ μλ°] 9μ₯ : μΌλ°μ μΈ νλ‘κ·Έλλ° μμΉ (0) | 2022.03.27 |
---|---|
[μ΄νν°λΈ μλ°] 8μ₯ : λ©μλ (1) | 2022.03.27 |
[μ΄νν°λΈ μλ°] 6μ₯ : μ΄κ±° νμ κ³Ό μ λν μ΄μ (0) | 2022.03.21 |
[μ΄νν°λΈ μλ°] 5μ₯ : μ λ€λ¦ (0) | 2022.03.14 |
[μ΄νν°λΈ μλ°] 4μ₯ : ν΄λμ€μ μΈν°νμ΄μ€ (0) | 2022.03.14 |