2023. 1. 10. 09:43γJAVA/Effective JAVA
item03. private μμ±μλ μ΄κ±° νμ μΌλ‘ μ±κΈν€μμ 보μ¦νλΌ.
" p24. λ©μλ μ°Έμ‘°λ₯Ό 곡κΈμλ‘ μ¬μ©ν μ μλ€. "
λ©μλ μ°Έμ‘° Method Reference λ?
: λ©μλ νλλ§ νΈμΆνλ λλ€ ννμμ μ€μ¬μ°λ λ°©λ²
λ©μλ μ°Έμ‘°λ λλ€ ννμμ΄ λ¨ νλμ λ©μλλ§μ νΈμΆνλ κ²½μ°μ ν΄λΉ λλ€ ννμμμ λΆνμν 맀κ°λ³μλ₯Ό μ κ±°νκ³ μ¬μ©ν μ μλλ‘ νλ€.
ν΄λμ€μ΄λ¦::λ©μλμ΄λ¦
μ°Έμ‘°λ³μμ΄λ¦::λ©μλμ΄λ¦
public class Person
{
LocalDate birthday;
public Person()
{
}
public Person(LocalDate birthday)
{
this.birthday = birthday;
}
public int getAge()
{
return LocalDate.now().getYear() - birthday.getYear();
}
public static int compareByAge(Person a, Person b)
{
return a.birthday.compareTo(b.birthday);
}
}
Personμ΄λΌλ ν΄λμ€κ° μκ³ ,
public static void main(String[] args)
{
List<Person> people = new ArrayList<>();
people.add(new Person(LocalDate.of(1998, 11, 11)));
people.add(new Person(LocalDate.of(2000, 1, 1)));
people.add(new Person(LocalDate.of(1999, 03, 02)));
// μ΅λͺ
λ΄λΆ ν΄λμ€
people.sort(new Comparator<Person>()
{
// Comparator μΈν°νμ΄μ€λ₯Ό ꡬνν ꡬν체
@Override
public int compare(Person o1, Person o2)
{
return o1.birthday.compareTo(o2.birthday);
}
});
// lambda
people.sort((p1, p2) -> Person.compareByAge(p1,p2));
// static λ©μλ μ°Έμ‘°
people.sort(Person::compareByAge);
// μμ±μ λ©μλ μ°Έμ‘°
ArrayList<LocalDate> dates = new ArrayList<>();
dates.add(LocalDate.of(2000, 1, 1));
dates.add(LocalDate.of(2001, 2, 2));
dates.add(LocalDate.of(2002, 3, 4));
List<Person> personList = dates.stream().map(Person::new).collect(Collectors.toList());
}
λ©μλ μ°Έμ‘° μ΄μ μλ λλ€ ννμμ΄κ³ , κ·Έ μ΄μ μλ μ΅λͺ λ΄λΆ ν΄λμ€λΌλ κ²μ΄ μλ€.
μ΅λͺ λ΄λΆ ν΄λμ€λ‘ 보면 μ°μ ComparatorλΌλ μΈν°νμ΄μ€λ₯Ό μ΅λͺ λ΄λΆ ν΄λμ€μμ ꡬννλ€.
κ·Έλ¦¬κ³ λλ€κ° μ΄λ₯Ό μ’ λ κ°λ¨νκ² ννν μ μλλ‘ ν΄μ€λ€.
λ§μ§λ§μΌλ‘ λ©μλ μ°Έμ‘°λ μ΄μ μ΄ λλ€κ° λ©μλ νλλ§ νΈμΆνλ€λ©΄ :: κΈ°νΈλ₯Ό μ¬μ©ν΄μ μ’ λ μ€μ¬μ ννν μ μλ€.
μμ μμ μμ compareByAgeκ° staticλ©μλλΌμ ν΄λμ€μ΄λ¦::λ©μλμ΄λ¦μΌλ‘ λ©μλ μ°Έμ‘°λ₯Ό νμ§λ§,
λ§μ½ static λ©μλκ° μλλΌλ©΄ κ°μ²΄λ₯Ό νλ μμ±ν λ€μ μ°Έμ‘°λ³μμ΄λ¦::λ©μλμ΄λ¦μΌλ‘ νΈμΆν μ μλ€.
κ·Έλ¦¬κ³ μμ±μλ₯Ό νΈμΆνλ λ©μλλ λ©μλ μ°Έμ‘°λ₯Ό μ΄μ©ν μ μλλ°, λ¨μν κ°μ²΄λ₯Ό μμ±νκ³ λ°ννλ λλ€ ννμμ λ©μλ μ°Έμ‘°λ‘ λ³νν μ μλ€.
μ¬κΈ°μ μ§κΈ Person ν΄λμ€λ νλΌλ―Έν°κ° μλ μμ±μμ κΈ°λ³Έ μμ±μ 2κ°κ° μμ΄μ κ·Έλ₯ Person::new νλ©΄ μλ¬κ° λλ€.
μμ±μ λ©μλ μ°Έμ‘°λ ν¨μν μΈν°νμ΄μ€μ λ΄μΌλ©΄ λλλ°
νλΌλ―Έν°κ° μλ μμ±μλΌλ©΄ Function<T, R> μ μ¬μ©νκ³ , κΈ°λ³Έ μμ±μλΌλ©΄ 리ν΄λ§ μλ Supplierλ₯Ό μ¬μ©νλ©΄ λλ€.
λ©μλ μ°Έμ‘° Method Reference μ¬μ© λ°©λ²
1οΈβ£ μ μ λ©μλ μ°Έμ‘°
// 1. μ μ λ©μλ μ°Έμ‘°
ToIntFunction<String> stringToIntFunction = (String s) -> Integer.parseInt(s); // lambda
ToIntFunction<String> stringToIntFunction1 = Integer::parseInt; // method reference
2οΈβ£ μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
// 2. μΈμ€ν΄μ€ λ©μλ μ°Έμ‘°
Person person = new Person();
Supplier<Integer> getAge = person::getAge;
3οΈβ£ μμ±μ λ©μλ μ°Έμ‘°
// 3. μμ±μ λ©μλ μ°Έμ‘°
Function<LocalDate, Person> function = Person::new;
Supplier<Person> supplier = Person::new;
π μ΅λͺ λ΄λΆ ν΄λμ€λ₯Ό λλ€μμΌλ‘ λ³ννλ©΄μ μ½λλ₯Ό λ μ€μ΄κ³ , κ°λ μ± μκ² κ΅¬ννμΌλ©°, λλ€μμμ λ©μλ νλλ§ νΈμΆνλκ² λ€λΌλ©΄ λ©μλ μ°Έμ‘°λ₯Ό ν΅ν΄μ μ’ λ κ°λ μ±μκ² ννν μ μλ€.