Part 1 ๊ธฐ์ด
Part 1 ๊ธฐ์ด ๊ด๋ จ
1์ฅ - ์๋ฐ8์ ๋์ฌ๊ฒจ๋ด์ผ ํ๋ ์ด์
Stream processing: stream์ด๋ ํ๋ฒ์ ํ ๊ฐ์ฉ ๋ง๋ค์ด์ง๋ ์ฐ์์ ์ธ ๋ฐ์ดํฐ ํญ๋ชฉ๋ค์ ๋ชจ์์ ๋งํ๋ค.
๋์ ํ๋ผ๋ฏธํฐํ: ๋ฉ์๋๋ฅผ ๋ค๋ฅธ ๋ฉ์๋์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ณ๋ ฌ์ฑ๊ณผ ๊ณต์ ๊ฐ๋ณ ๋ฐ์ดํฐ: ๋ค๋ฅธ ์ฝ๋์ ๋์์ ์คํํ๋๋ผ๋ ์์ ํ๊ฒ ์คํํ ์ ์๋ ์ฝ๋๋ฅผ ๋ง๋๋ ค๋ฉด ๊ณต์ ๋ ๊ฐ๋ณ ๋ฐ์ดํฐ์ ์ ๊ทผํ์ง ๋ง์์ผ ํ๋ค. ์ด๋ฐ ํจ์๋ฅผ pure ํจ์, stateless ํจ์๋ผ ๋ถ๋ฅธ๋ค.
์๋ฐ ํจ์
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํจ์๋ผ๋ ์ฉ์ด๋ ๋ฉ์๋ ํนํ ์ ์ ๋ฉ์๋์ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ค. ์๋ฐ์ ํจ์๋ ์ด์ ๋ํด ์ํ์ ์ธ ํจ์์ฒ๋ผ ์ฌ์ฉ๋๋ฉฐ ๋ถ์์ฉ์ ์ผ์ผํค์ง ์๋ ํจ์๋ฅผ ์๋ฏธํ๋ค.
์๋ฐ8์์๋ ํจ์๋ฅผ ์๋ก์ด ๊ฐ์ ํ์์ผ๋ก ์ถ๊ฐํ๋ค.(์ฆ, ํจ์ ์์ฒด๊ฐ ๊ฐ)
๋ฉ์๋ ๋ ํผ๋ฐ์ค
e.g. ๋๋ ํ ๋ฆฌ์์ ๋ชจ๋ ์จ๊ฒจ์ง ํ์ผ์ ํํฐ๋งํ๋ ๋ฌธ์ ์์ ์ฐ์ ์ฃผ์ด์ง ํ์ผ์ด ์จ๊ฒจ์ ธ ์๋์ง ์ฒดํฌํ๋ ๊ธฐ๋ฅ
File[] hiddenFiles = new File(โ.โ).listFiles(new FileFilter(){
public boolean accept(File file){
return file.isHidden(); //์จ๊ฒจ์ง ํ์ผ ํํฐ๋ง.
}
}
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์๋ฐ8 ์ ๊น์ง๋ File
ํด๋์ค์ ์ด๋ฏธ isHidden()
์ด๋ผ๋ ๋ฉ์๋๊ฐ ์๋๋ฐ FileFilter
๋ก ๊ฐ์ผ ๋ค์์ FileFilter
๋ฅผ ์ธ์คํด์คํํด์ผ ํ๋ค.
File[] hiddenFiles = new File(โ.โ).listFiles(File::isHidden);
์๋ฐ8์ ๋ฉ์๋ ๋ ํผ๋ฐ์ค :: (์ด ๋ฉ์๋๋ฅผ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ผ๋ ์๋ฏธ)๋ฅผ ์ด์ฉํด์ listFiles()
์ ์ง์ ์ ๋ฌํ ์ ์๋ค. ๊ธฐ์กด์ ๊ฐ์ฒด ๋ ํผ๋ฐ์ค(new๋ก ๊ฐ์ฒด ๋ ํผ๋ฐ์ค๋ฅผ ์์ฑํจ)๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด๋ฅผ ์ด๋ฆฌ์ ๋ฆฌ ์ฃผ๊ณ ๋ฐ์๋ ๊ฒ์ฒ๋ผ ์๋ฐ 8์์๋ File::isHidden
์ ์ด์ฉํด์ ๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ง๋ค์ด ์ ๋ฌํ ์ ์๊ฒ ๋์๋ค.
๋๋ค: ์ต๋ช ํจ์
ํจ์๋ ๊ฐ์ผ๋ก ์ทจ๊ธํ ์ ์๋ค. e.g. (int x) -> x+1
: x
๋ผ๋ ์ธ์๋ฅผ ํธ์ถํ๋ฉด x+1
์ ๋ฐํํ๋ผ.
์ฝ๋ ๋๊ฒจ์ฃผ๊ธฐ: ์์
Apple
์ด๋ผ๋ ํด๋์ค์ getColor()
๋ผ๋ ๋ฉ์๋๊ฐ ์๊ณ , Apples ๋ฆฌ์คํธ๋ฅผ ํฌํจํ๋ inventory
๋ผ๋ ๋ณ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. ์ด๋ ๋ชจ๋ ๋
น์ ์ฌ๊ณผ๋ฅผ ์ ํํด์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ ค ํ๋ค. ์ด์ฒ๋ผ ํน์ ํญ๋ชฉ์ ์ ํํด์ ๋ฐํํ๋ ๋์์ โํํฐ'๋ผ๊ณ ํ๋ค. ์๋ฐ8 ์ด์ ์๋ ๋ค์์ฒ๋ผ filterGreenApples
๋ผ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ ๊ฒ์ด๋ค.
public static List<Apple> filterGreenApples(List<Apple> inventory){
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory){
if(โgreenโ.equals(apple.getColor()){
result.add(apple);
}
}
return result;
}
ํ์ง๋ง ๋๊ตฐ๊ฐ๋ ์ ํ์ ๋ฌด๊ฒ๋ก ํํฐ๋ง ํ๊ณ ์ถ์ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ์ ์ฒด ์ฝ๋๋ฅผ ๋ณต๋ถํด์ ๋ค์์ฒ๋ผ ๊ตฌํํ ์ ์์ ๊ฒ์ด๋ค.
public static List<Apple> filterGreenApples(List<Apple> inventory){
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory){
if(apple.getWeight() > 150){
result.add(apple);
}
}
return result;
}
์ค๋ณต์ ๋จ์ ์ด ๋๋ฌ๋๋ ์์ข์ ๋ฐฉ๋ฒ์ด๋ค. ์๋ฐ8 ์์๋ ์ฝ๋๋ฅผ ์ธ์๋ก ๋๊ฒจ์ค ์ ์์ด์ filter()
๋ฉ์๋๋ฅผ ์ค๋ณต์ผ๋ก ๊ตฌํํ ํ์๊ฐ ์๋ค.
public static boolean isGreenApple(Apple apple){
return "green".equals(apple.getColor());
}
public static boolean isHeavyApple(Apple apple){
return apple.getWeight() > 150;
}
static List<Apple> filterApples(List<Apple> inventory,
Predicate<Apple> p) {
List<Apple> result = new ArrayList<>();
for(Apple apple : inventory){
if(p.test(apple)){
result.add(apple);
}
}
return result;
}
๋ค์ ์ฒ๋ผ ๋ฉ์๋๋ฅผ ํธ์ถ ํ ์ ์๋ค.
filterApples(inventory, Apple::isGreenApple);
filterApples(inventory, Apple::isHeavyApple);
Predicate
: ์ํ์์๋ ์ธ์๋ก ๊ฐ์ ๋ฐ์ true / false๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ Predicate๋ผ๊ณ ํ๋ค.
๋ฉ์๋ ์ ๋ฌ์์ ๋๋ค๋ก
isHeavyApple
, isGreenApple
์ฒ๋ผ ํ๋ ๋ฒ๋ง ์ฌ์ฉํ ๋ฉ์๋๋ฅผ ๋งค๋ฒ ์ ์ํ๋ ๊ฒ์ ๊ท์ฐฎ์ ์ผ์ด๋ค. ์๋ฐ8 ์์๋ ๋ค์์ฒ๋ผ ์๋ก์ด ๊ฐ๋
์ ์ด์ฉํด์ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
filterApples(inventory, (Apple a) -> โgreenโ.equals(a.getColor());
filterApples(inventory, (Apple a) -> a.getWeight() > 150);
filterApples(inventory, (Apple a) -> a.getWeight() < 80 || โbrownโ.equals(a.getColor());
์ฆ, ํ ๋ฒ๋ง ์ฌ์ฉํ ๋ฉ์๋๋ ๋ฐ๋ก ์ ์๋ฅผ ๊ตฌํํ ํ์๊ฐ ์๋ค. ํ์ง๋ง ๋๋ค๊ฐ ๋ช ์ค ์ด์์ผ๋ก ๊ธธ์ด์ง๋ค๋ฉด(๋ณต์กํ ๋์์ ์ํํ๋ ์ํฉ) ์ต๋ช ๋๋ค๋ณด๋ค๋ ์ฝ๋๊ฐ ์ํํ๋ ์ผ์ ์ ์ค๋ช ํ๋ ์ด๋ฆ์ ๊ฐ์ง ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค. ์ฝ๋์ ๋ช ํ์ฑ์ด ์ฐ์ ์ ๋์ด์ผ ํ๋ค.
์คํธ๋ฆผ
๋ค์์ ๋ฆฌ์คํธ์์ ๊ณ ๊ฐ์ ๊ฑฐ๋(Transcation)๋ง ํํฐ๋งํ ๋ค์์ ํตํ๋ก ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฃนํํ๋ ์ฝ๋๋ค.
Map<Currency, List<Transaction>> transactionsByCurrencies = new HashMap<>(); // ๊ทธ๋ฃนํ๋ ํธ๋์ญ์
์ ๋ํ Map ์์ฑ
for (Transaction transaction : transactions){ // ํธ๋์ญ์
์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณต
if (transaction.getPrice() > 1000){ // ๊ณ ๊ฐ์ ํธ๋์ญ์
์ ํํฐ๋ง
Currency currency = transaction.getCurrency(); // ํธ๋์ญ์
์ ํตํ ์ถ์ถ
List<Transcation> transactionsForCurrency = transactionsByCurrencies.get(currency);
if (transactionsForCurrency == null){ // ํ์ฌ ํตํ์ ๊ทธ๋ฃนํ๋ ๋งต์ ํญ๋ชฉ์ด ์์ผ๋ฉด ์๋ก ๋ง๋ ๋ค.
transactionsForCurrency = new ArrayList<>();
transactionsByCurrencies.put(currency, transactionsForCurrency);
}
transactionsForCurrency.add(transaction); // ํ์ฌ ํ์๋ ํธ๋์ญ์
์ ๊ฐ์ ํตํ์ ํธ๋์ญ์
๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ค.
}
}
์ ์์ ์ฝ๋์๋ ์ค์ฒฉ๋ ์ ์ด ํ๋ฆ ๋ฌธ์ฅ์ด ๋ง์์ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์ดํดํ๊ธฐ ์ด๋ ต๋ค. ์คํธ๋ฆผ API๋ฅผ ์ด์ํ๋ฉด ๋ค์์ฒ๋ผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
import static java.util.stream.Collections.toList;
Map<Currency, List<Transaction>> transactionByCurrencies =
transactions.stream()
.filter((Transaction t) -> t.getPrice() > 1000) //๊ณ ๊ฐ์ ํธ๋์ญ์
ํํฐ๋ง
.collect(groupingBy(Transaction::getCurrency);
์ปฌ๋ ์ ์์๋ ๋ฐ๋ณต ๊ณผ์ ์ ์ง์ ์ฒ๋ฆฌํด์ผ ํ๋ค. ์ด๋ฐ ๋ฐฉ์์ ๋ฐ๋ณต์ ์ธ๋ถ ๋ฐ๋ณต์ด๋ผ๊ณ ํ๋ค. ๋ฐ๋ฉด ์คํธ๋ฆผ API๋ฅผ ์ด์ฉํ๋ฉด ๋ฃจํ๋ฅผ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ฒ๋ฆฌ๋๋ค. ์ด์ ๊ฐ์ ๋ฐ๋ณต์ ๋ด๋ถ ๋ฐ๋ณต์ด๋ผ๊ณ ํ๋ค.
์ปฌ๋ ์ ์ ์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ๊ทผํ ์ง์ ์ค์ ์ ๋๋ ๋ฐ๋ฉด ์คํธ๋ฆผ์ ๋ฐ์ดํฐ์ ์ด๋ค ๊ณ์ฐ์ ํ ๊ฒ์ธ์ง ๋ฌ์ฌํ๋ ๊ฒ์ ์ค์ ์ ๋๋ค๋ ์ ์ ๊ธฐ์ตํ์. ์คํธ๋ฆผ์ ์คํธ๋ฆผ ๋ด์ ์์๋ฅผ ์ฝ๊ฒ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ค๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
์ปฌ๋ ์ ์ ํํฐ๋งํ ์ ์๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ์ปฌ๋ ์ ์ ์คํธ๋ฆผ์ผ๋ก ๋ฐ๊พธ๊ณ , ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ ๋ค์์, ๋ฆฌ์คํธ๋ก ๋ค์ ๋ณต์ํ๋ ๊ฒ์ด๋ค.
๋ํดํธ ๋ฉ์๋
๋ํดํธ ๋ฉ์๋๋ ํน์ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ ๋ฐ ๋์์ ์ฃผ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ ๋ฏธ๋์ ํ๋ก๊ทธ๋จ์ด ์ฝ๊ฒ ๋ณํํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
2์ฅ - ๋์ ํ๋ผ๋ฏธํฐํ ์ฝ๋ ์ ๋ฌํ๊ธฐ
๋์ ํ๋ผ๋ฏธํฐํ๋ฅผ ์ด์ฉํ๋ฉด ์์ฃผ ๋ฐ๋๋ ์๊ตฌ์ฌํญ์ ํจ๊ณผ์ ์ผ๋ก ๋์ํ ์ ์๋ค. ๋์ ํ๋ผ๋ฏธํฐํ๋ ์์ง์ ์ด๋ป๊ฒ ์คํํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ์ง ์์ ์ฝ๋ ๋ธ๋ก์ ์๋ฏธํ๋ค. ์ด ์ฝ๋ ๋ธ๋ก์ ๋์ค์ ํ๋ก๊ทธ๋จ์์ ํธ์ถํ๋ค. ์ฆ, ์ฝ๋ ๋ธ๋ก์ ์คํ์ ๋์ค์ผ๋ก ๋ฏธ๋ค์ง๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋ ๋ธ๋ก์ ๋ฐ๋ผ ๋ฉ์๋์ ๋์์ด ํ๋ผ๋ฏธํฐํ๋๋ค.
๋์ ํ๋ผ๋ฏธํฐํ
public interface ApplePredicate{
boolean test (Apple apple);
}
์ ํ ์กฐ๊ฑด์ ๊ฒฐ์ ํ๋ ์ธํฐํ์ด์ค์ด๋ค. ์ด์ ๊ฐ์ ๋์์ ํ๋ ๋์ผ์ดํธ(๋ถ๋ฆฐ์ ๋ฐํํ๋ ํจ์)๋ผ๊ณ ํ๋ค. ๋ค์ ์์ ์ฒ๋ผ ๋ค์ํ ์ ํ ์กฐ๊ฑด์ ๋ํํ๋ ์ฌ๋ฌ ๋ฒ์ ์ ApplePredicate
๋ฅผ ์ ์ํ ์ ์๋ค.
//๋ฌด๊ฑฐ์ด ์ฌ๊ณผ๋ง ์ ํ
public class AppleHeavyWeightPredicate implements ApplePredicate{
public boolean test(Apple apple){
return apple.getWeight() > 150;
}
}
//๋
น์ ์ฌ๊ณผ๋ง ์ ํ
public class AppleGreenColorPredicate implements ApplePredicate{
public boolean test(Apple apple){
return โgreenโ.equals(apple.getColor());
}
}
// ํ
ํ๋ฆฟ ๋ถ๋ถ
public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate p){
List<Apple> result = new ArrayList<>();
for (Apple apple : inventory){
if (p.test(apple)){
result.add(apple);
}
}
return result;
}
ํ์ง๋ง ์ต๋ช ํด๋์ค๋ฅผ ์ฌ์ฉํด๋ ๋ฐ๋ณต๋์ด ์ง์ ๋ถํ ์ฝ๋๋ ์ฌ์ ํ ๋ง๊ณ ๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ต๋ช ํด๋์ค์ ์ฌ์ฉ์ ์ต์ํ์ง ์๋ค.
๋๋ค ํํ์ ์ฌ์ฉ
์๋ฐ8์ ๋๋ค ํํ์์ ์ด์ฉํด์ ๊ฐ๋จํ ์ฌ๊ตฌํํ ์ ์๋ค.
List<Apple> result
= filterApples(inventory, (Apple apple) -> โredโ.equals(apple.getColor()));
๋ฆฌ์คํธ ํ์์ผ๋ก ์ถ์ํ
Apple
์ด์ธ์ ๋ค์ํ ๋ฌผ๊ฑด์์ ํํฐ๋ง์ด ์๋ํ๋๋ก ๋ฆฌ์คํธ ํ์์ ์ถ์ํํ ์ ์๋ค.
public interface Predicate<T>{
boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p){
List<T> result = new ArrayList<>();
for (T e : list){
if (p.test(e)){
result.add(e);
}
}
return result;
}
์ด์ ๋ฐ๋๋, ์ค๋ ์ง, ์ ์, ๋ฌธ์์ด ๋ฑ์ ๋ฆฌ์คํธ์ ํํฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
List<Apple> redApples = filter(inventory, (Apple apple) -> โredโ.equals(apple.getColor());
List<String> evenNumbers = filter(numbers, (Integer i) -> i % 2 == 0);
์ค์ ์์ - Comparator
๋ก ์ ๋ ฌํ๊ธฐ
์๋ฐ8์ List
์๋ sort
๋ฉ์๋๊ฐ ํฌํจ๋์ด ์๋ค.(๋ฌผ๋ก Collections.sort
๋ ์กด์ฌ) ๋ค์๊ณผ ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ java.util.Comparator
๊ฐ์ฒด๋ฅผ ์ด์ฉํด์ sort์ ๋์์ ํ๋ผ๋ฏธํฐํ ํ ์ ์๋ค.
//java.uitl.Comparator
public interface Comparator<T>{
public int compare(T o1, T o2);
}
Comparator
๋ฅผ ๊ตฌํํด์ sort
๋ฉ์๋์ ๋์์ ๋ค์ํํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ต๋ช
ํด๋์ค๋ฅผ ์ด์ฉํด์ ๋ฌด๊ฒ๊ฐ ์ ์ ์์ผ๋ก ๋ชฉ๋ก์์ ์ฌ๊ณผ๋ฅผ ์ ๋ ฌํ ์ ์๋ค.
inventory.sort(new Comparator<Apple>{
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
});
๋๋ค ํํ์์ ์ด์ฉํ๋ฉด ๋ค์์ฒ๋ผ ๊ฐ๋จํ๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
inventory.sort(
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
3์ฅ - ๋๋ค ํํ์
๋๋ค๋ ๋ฌด์์ธ๊ฐ
๋๋ค ํํ์์ ๋ฉ์๋๋ก ์ ๋ฌํ ์ ์๋ ์ต๋ช ํจ์๋ฅผ ๋จ์ํํ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค.
Comparator<Apple> byWeight = new Comparator<Apple>() {
public int compare(Apple a1, Apple a2) {
return a1.getWeight().compareTo(a2.getWeight());
}
};
Comparator<Apple> byWeight =
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
๋๋ค๋ ์ธ ๋ถ๋ถ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
- ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ : Comparator์ compare ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ(๋๊ฐ์ ์ฌ๊ณผ).
- ํ์ดํ : ํ์ดํ(
->
)๋ ๋๋ค์ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ์ ๋ฐ๋๋ฅผ ๊ตฌ๋ถํ๋ค. - ๋๋ค์ ๋ฐ๋ : ๋ ์ฌ๊ณผ์ ๋ฌด๊ฒ๋ฅผ ๋น๊ตํ๋ค. ๋๋ค์ ๋ฐํ๊ฐ์ ํด๋นํ๋ ํํ์์ด๋ค.
์๋ฐ8์ ์ ํจํ 5๊ฐ์ง ๋๋ค ํํ์
(String s) -> s.length()
์ฒซ ๋ฒ์งธ ๋๋ค ํํ์์ String ํ์์ ํ๋ผ๋ฏธํฐ ํ๋๋ฅผ ๊ฐ์ง๋ฉฐ int๋ฅผ ๋ฐํํ๋ค. ๋๋ค ํํ์์๋ return
์ด ํจ์ถ๋์ด ์์ผ๋ฏ๋ก return
๋ฌธ์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
(Apple a) -> a.getWeight() > 150
๋๋ฒ์งธ ๋๋ค ํํ์์ Apple
ํ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๋ฉฐ boolean
์ ๋ฐํํ๋ค.
(int x, int y) -> {
System.out.println(โResult:โ);
System.out.println(x+y)
};
์ธ ๋ฒ์งธ ๋๋ค ํํ์์ int
ํ์์ ํ๋ผ๋ฏธํฐ ๋ ๊ฐ๋ฅผ ๊ฐ์ง๋ฉฐ ๋ฆฌํด๊ฐ์ด ์๋ค(void
๋ฆฌํด). ์ด ์์ ์์ ๋ณผ ์ ์๋ฏ์ด ๋๋ค ํํ์์ ์ฌ๋ฌ ํ์ ๋ฌธ์ฅ์ ํฌํจํ ์ ์๋ค.
() -> 42
๋ค ๋ฒ์งธ ๋๋ค ํํ์์ ํ๋ผ๋ฏธํฐ๊ฐ ์์ผ๋ฉฐ int
๋ฅผ ๋ฐํํ๋ค.
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
๋ค์ฏ ๋ฒ์งธ ๋๋ค ํํ์์ Apple ํ์์ ํ๋ผ๋ฏธํฐ ๋ ๊ฐ๋ฅผ ๊ฐ์ง๋ฉฐ int๋ฅผ ๋ฐํํ๋ค.
//cf) ์ ํจํ์ง ์์ ๋๋ค ํํ์
(Integer i ) -> return โAlanโ + i;
(String s) -> {โIron Manโ;}
//return์ ํ๋ฆ ์ ์ด๋ฌธ์ด๋ค. { } ์์ ์์ด์ผ ํ๋ค.
(Integer i ) -> { return โAlanโ + i };
//โIron Manโ์ ๊ตฌ๋ฌธ(statement)์ด ์๋๋ผ ํํ์(expression)์ด๋ค.
(String s) -> โIron Manโ ๋๋ (String s) -> { return โIron Manโ }
์ด๋์, ์ด๋ป๊ฒ ๋๋ค๋ฅผ ์ฌ์ฉํ ๊น?
ํจ์ํ ์ธํฐํ์ด์ค ๋ผ๋ ๋ฌธ๋งฅ์์ ๋๋ค ํํ์์ ์ฌ์ฉํ ์ ์๋ค. ํจ์ํ ์ธํฐํ์ด์ค๋ ์ ํํ ํ๋์ ์ถ์ ๋ฉ์๋๋ฅผ ์ง์ ํ๋ ์ธํฐํ์ด์ค๋ค. ์ง๊ธ๊น์ง ์ดํด๋ณธ ์๋ฐ API์ ํจ์ํ ์ธํฐํ์ด์ค๋ก Comparator
, Runnable
๋ฑ์ด ์๋ค.
//java.util.Comparator
public interface Comparator<T>{
int compare(T o1, T o2);
}
//java.lang.Runnable
public interface Runnable{
void run();
}
์ธํฐํ์ด์ค๋ ๋ํดํธ ๋ฉ์๋(์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ๊ตฌํํ์ง ์์ ํด๋์ค๋ฅผ ๊ณ ๋ คํด์ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ๋ ๋ฐ๋๋ฅผ ํฌํจํ๋ ๋ฉ์๋)๋ฅผ ํฌํจํ ์ ์๋ค. ๋ง์ ๋ํดํธ ๋ฉ์๋๊ฐ ์๋๋ผ๋ ์ถ์ ๋ฉ์๋๊ฐ ์ค์ง ํ๋๋ฉด ํจ์ํ ์ธํฐํ์ด์ค๋ค.
๋๋ค ํํ์์ผ๋ก ํจ์ํ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋ ๊ตฌํ์ ์ง์ ์ ๋ฌํ ์ ์์ผ๋ฏ๋ก ์ ์ฒด ํํ์์ ํจ์ํ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค๋ก ์ทจ๊ธ(๊ธฐ์ ์ ์ผ๋ก ๋ฐ์ง๋ฉด ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ concrete ๊ตฌํํ ํด๋์ค์ ์ธ์คํด์ค)ํ ์ ์๋ค.
ํจ์ ๋์คํฌ๋ฆฝํฐ
ํจ์ํ ์ธํฐํ์ด์ค์ ์ถ์๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ํจ์ ๋์คํฌ๋ฆฝํฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์๋ฅผ ๋ค์ด () -> void
๋ผ๋ ํ๊ธฐ๋ ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ๊ฐ ์์ผ๋ฉฐ void
๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์๋ฏธํ๋ค. ๋๋ค ํํ์์ ํจ์ํ ์ธํฐํ์ด์ค์ ์ถ์ ๋ฉ์๋์ ๊ฐ์ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋๋ค๋ ์ฌ์ค์ ๊ธฐ์ตํ์.
ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ธ์๋ฅผ ๋ฐ๋ ๋ฉ์๋์๋ง ๋๋ค ํํ์์ ์ฌ์ฉํ ์ ์๋ค.
execute(() -> {});
public void execute(Runnable r){
r.run();
}
@FunctionalInterface
์ ํจ์ํ ์ธํฐํ์ด์ค์์ ๊ฐ๋ฆฌํค๋ ์ ๋ ธํ ์ด์ ์ด๋ค. ๋ง์ฝ ์ค์ ๋ก ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์๋๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
๋๋ค ํ์ฉ: ์คํ ์ด๋ผ์ด๋ ํจํด
์์ ์ฒ๋ฆฌ(์๋ฅผ ๋ค๋ฉด DB์ ํ์ผ ์ฒ๋ฆฌ)์ ์ฌ์ฉํ๋ ์ํ ํจํด์ ์์์ ์ด๊ณ , ์ฒ๋ฆฌํ ๋ค์์, ์์์ ๋ซ๋ ์์๋ก ์ด๋ฃจ์ด์ง๋ค. ์ค์ ๊ณผ ์ ๋ฆฌ ๊ณผ์ ์ ๋๋ถ๋ถ ๋น์ทํ๋ค. ์ฆ, ์ค์ ์์์ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์ค์ ๊ณผ ์ ๋ฆฌ ๋ ๊ณผ์ ์ด ๋๋ฌ์ธ๋ ํํ๋ฅผ ๊ฐ๋๋ฐ ์ด ๊ฐ์ ํ์์ ์ฝ๋๋ฅผ ์คํ ์ด๋ผ์ด๋ ํจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
public String processFile() throws IOException{
try(BufferedReader br =
new BufferedReader(new FileReader("data.txt"))){
return br.readLine();
}
}
์๋ฐ7์ ์๋ก ์ถ๊ฐ๋ try-with-resources ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ๋ช ์์ ์ผ๋ก ๋ซ์ ํ์๊ฐ ์๋ค.
ํ์ฌ ์ฝ๋๋ ํ์ผ์์ ํ ๋ฒ์ ํ ์ค๋ง ์ฝ์ ์ ์๋ค. ๊ธฐ์กด์ ์ค์ , ์ ๋ฆฌ ๊ณผ์ ์ ์ฌ์ฌ์ฉํ๊ณ processFile()
๋ฉ์๋๋ง ๋ค๋ฅธ ๋์์ ๋ค๋ฅธ ๋์์ ์ํํ๋๋ก ํด๋ณด์. processFile()
์ ๋์์ ํ๋ผ๋ฏธํฐํํ๋ ๊ฒ์ด๋ค. ์ฆ, processFile()
๋ฉ์๋๊ฐ BufferedReader
๋ฅผ ์ด์ฉํด์ ๋ค๋ฅธ ๋์์ ์ํํ ์ ์๋๋ก processFile()
๋ฉ์๋๋ก ๋์์ ์ ๋ฌํด์ผ ํ๋ค.
String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());
ํจ์ํ ์ธํฐํ์ด์ค ์๋ฆฌ์ ๋๋ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ BufferedReader -> String
๊ณผ IOException
์ ๋์ง ์ ์๋ ์๊ทธ๋์ฒ์ ์ผ์นํ๋ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
@FuntionalInterface
public interface BufferedReaderProcessor{
String process(BufferedReader b) throws IOException;
}
public String processFile(BufferedReaderProcessor p) throws IOException{
try(BufferedReader br =
new BufferedReader(new FileReader("data.txt"))){
return p.process(br);
}
}
์ด์ BufferedReaderProcessor
์ ์ ์๋ process()
๋ฉ์๋์ ์๊ทธ๋์ฒ์ ์ผ์นํ๋ ๋ค์ํ ๋๋ค๋ฅผ ์ ๋ฌํ ์ ์๋ค.
String oneLine = processFile((BufferedReader br) -> br.readLine());
String twoLines = processFile((BufferedReader br) -> br.readLine() + br.readLine());
๋๋ค์ ํจ์ํ ์ธํฐํ์ด์ค ์์
์ฌ์ฉ ์ฌ๋ก | ๋๋ค ์์ | ๋์ํ๋ ํจ์ํ ์ธํฐํ์ด์ค |
---|---|---|
Boolean ํํ | (List<String> list) -> list.isEmpty() | Predicate<List<String>> |
๊ฐ์ฒด ์์ฑ | () -> new Apple(10) | Supplier<Apple> |
๊ฐ์ฒด์์ ์๋น | (Apple a) -> System.out.println(a.getWeight()) | Consumer<Apple> |
๊ฐ์ฒด์์ ์ ํ/์ถ์ถ | (String s) -> s.length() | Function<String, Integer> ๋๋ ToInteFunction<String> |
๋ ๊ฐ ์กฐํฉ | (int a, int b) -> a * b | IntBinaryOperator |
๋ ๊ฐ์ฒด ๋น๊ต | (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) | BiFunction<Apple,Apple,Integer> ๋๋ ToIntBiFunction<Apple,Apple> |
์์ธ, ๋๋ค, ํจ์ํ ์ธํฐํ์ด์ค์ ๊ด๊ณ
ํจ์ํ ์ธํฐํ์ด์ค๋ ํ์ธ๋ ์์ธ๋ฅผ ๋์ง๋ ๋์์ ํ์ฉํ์ง ์๋๋ค. ๊ทธ๋์ ์์ธ๋ฅผ ๋์ง๋ฅผ ๋๋ค ํํ์์ ๋ง๋ค๋ ค๋ฉด ํ์ธ๋ ์์ธ๋ฅผ ์ ์ธํ๋ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ์ ์ํ๊ฑฐ๋ ๋๋ค๋ฅผ try/catch ๋ธ๋ก์ผ๋ก ๊ฐ์ธ์ผ ํ๋ค.
@FunctionalInterface
public interface BufferedReaderProcessor{
String process(BufferedReader b) throws IOException;
}
BufferedReaderProcessor p = (BufferedReader br) -> br.readLine();
์์ ์์ ๋ IOException
์ ๋ช
์์ ์ผ๋ก ์ ์ธํ๋ ํจ์ํ ์ธํฐํ์ด์ค BufferedReaderProcessor
์ด๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ Function<T, R>
ํ์์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ํ๋ API๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ง์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ค์ด ์ํฉ์ด๋ค. ์ด๋ฐ ์ํฉ์์๋ ์๋ ์์ ์ฒ๋ผ ๋ช
์์ ์ผ๋ก ํ์ธ๋ ์์ธ๋ฅผ ์ก์ ์ ์๋ค.
Function<BufferedReader, String> f =
(BufferedReader b) -> {
try{
return b.readLine();
}
catch(IOException e){
throw new RuntimeException(e);
}
};
ํ์ ๊ฒ์ฌ, ํ์ ์ถ๋ก , ์ ์ฝ
๋๋ค ํํ์ ์์ฒด์๋ ๋๋ค๊ฐ ์ด๋ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋์ง์ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ง ์๋ค. ๋๋ค๊ฐ ์ฌ์ฉ๋๋ context๋ฅผ ์ด์ฉํด์ ๋๋ค์ ํ์(type)์ ์ถ๋ก ํ ์ ์๋ค.
ํน๋ณํ void ํธํ ๊ท์น
๋๋ค์ ๋ฐ๋์ ์ผ๋ฐ ํํ์์ด ์์ผ๋ฉด void
๋ฅผ ๋ฐํํ๋ ํจ์ ๋์คํฌ๋ฆฝํฐ์ ํธํ๋๋ค(๋ฌผ๋ก ํ๋ผ๋ฏธํฐ ๋ฆฌ์คํธ๋ ํธํ๋์ด์ผ ํจ). ์๋ฅผ ๋ค์ด List
์ add
๋ฉ์๋๋ boolean
์ ๋ฐํํ์ง๋ง Consumer
์ปจํ
์คํธ(T -> void)
์๋ ์ ํจํ ์ฝ๋๋ค.
// Predicate๋ ๋ถ๋ฆฐ ๋ฐํ๊ฐ์ ๊ฐ๋๋ค.
Predicate<String> p = s -> list.add(s);
// Consumer๋ void ๋ฐํ๊ฐ์ ๊ฐ๋๋ค.
Consumer<String> b = s -> list.add(s);
ํ์ ์ถ๋ก
//ํ์์ ์ถ๋ก ํ์ง ์์
Comparator<Apple> c = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());
//ํ์์ ์ถ๋ก ํจ
Comparator<Apple> c = (a1, a2) -> a1.getWeight().compareTo(a2.getWeight());
//ํ์ ์ถ๋ก ํ ๋ค๋ฅธ ์์
List<Apple> greenApples = filter(inventory, a -> โgreenโ.equals(a.getColor()));
์ง์ญ ๋ณ์ ์ฌ์ฉ
๋๋ค ํํ์์์๋ ์์ ๋ณ์(ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ง ๋ณ์๊ฐ ์๋๋ผ ์ธ๋ถ์์ ์ ์๋ ๋ณ์)๋ฅผ ํ์ฉํ ์ ์๋ค. ์ด์ ๊ฐ์ ๋์์ ๋๋ค ์บก์ณ๋ง์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
int portNumber = 123;
Runnable r = () -> System.out.println(portNumber);
ํ์ง๋ง ์์ ๋ณ์์๋ ์ฝ๊ฐ์ ์ ์ฝ์ด ์๋ค. ๋๋ค๋ ์ธ์คํด์ค ๋ณ์์ ์ ์ ๋ณ์๋ฅผ ์์ ๋กญ๊ฒ ์บก์ณ(์์ ์ ๋ฐ๋์์ ์ฐธ์กฐํ ์ ์๋๋ก) ํ ์ ์๋ค. ํ์ง๋ง ๊ทธ๋ฌ๋ ค๋ฉด ์ง์ญ ๋ณ์๋ final
๋ก ์ ์ธ๋๊ฑฐ๋ ์ค์ง์ ์ผ๋ก final
์ฒ๋ผ ์ทจ๊ธ๋์ด์ผ ํ๋ค.
//์ปดํ์ผ ์๋ฌ
int portNumber = 123;
Runnable r = () -> System.out.println(portNumber);
portNumber = 321;
์ง์ญ๋ณ์์ ์ ์ด๋ฌํ ์ ์ฝ์ด ํ์ํ์ง ์์๋ณด์.
์ฐ์ ๋ด๋ถ์ ์ผ๋ก ์ง์ญ ๋ณ์๋ ์คํ์ ์์นํ๋ค. ๋๋ค์์ ์ง์ญ ๋ณ์์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค๋ ๊ฐ์ ํ์ ๋๋ค๊ฐ ์ค๋ ๋์์ ์คํ๋๋ค๋ฉด ๋ณ์๋ฅผ ํ ๋นํ ์ค๋ ๋๊ฐ ์ฌ๋ผ์ ธ์ ๋ณ์ ํ ๋น์ด ํด์ ๋์๋๋ฐ๋ ๋๋ค๋ฅผ ์คํํ๋ ์ค๋ ๋์์๋ ํด๋น ๋ณ์์ ์ ๊ทผํ๋ ค ํ ์ ์๋ค. ๋ฐ๋ผ์ ์๋ฐ ๊ตฌํ์์๋ ์๋ ๋ณ์์ ์ ๊ทผ์ ํ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ์์ ์ง์ญ ๋ณ์์ ๋ณต์ฌ๋ณธ์ ์ ๊ณตํ๋ค. ๋ฐ๋ผ์ ๋ณต์ฌ๋ณธ์ ๊ฐ์ด ๋ฐ๋์ง ์์์ผ ํ๋ฏ๋ก ์ง์ญ ๋ณ์์๋ ํ ๋ฒ๋ง ๊ฐ์ ํ ๋นํด์ผ ํ๋ค๋ ์ ์ฝ์ด ์๊ธด๊ฒ์ด๋ค.
๋๋ค์ ์ต๋ช
ํด๋์ค ๋ชจ๋ ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋ ์ ์์ผ๋ฉฐ ์์ ์ ์ธ๋ถ ์์ญ์ ๋ณ์์ ์ ๊ทผํ ์ ์๋ค. ๋ค๋ง ๋๋ค์ ์ต๋ช
ํด๋์ค๋ ๋๋ค๊ฐ ์ ์๋ ๋ฉ์๋์ ์ง์ญ ๋ณ์์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค. ๋๋ค๊ฐ ์ ์๋ ๋ฉ์๋์ ์ง์ญ ๋ณ์ซ๊ฐ์ final
๋ณ์์ฌ์ผ ํ๋ค. ๋๋ค๋ ๋ณ์๊ฐ ์๋ ๊ฐ์ ๊ตญํ๋์ด ์ด๋ค ๋์์ ์ํํ๋ค๋ ์ฌ์ค์ด ๋ช
ํํด์ง๋ค. ์ง์ญ ๋ณ์ซ๊ฐ์ ์คํ์ ์กด์ฌํ๋ฏ๋ก ์์ ์ ์ ์ํ ์ค๋ ๋์ ์์กด์ ๊ฐ์ด ํด์ผ ํ๋ฉฐ ๋ฐ๋ผ์ ์ง์ญ ๋ณ์๋ final
์ด์ด์ผ ํ๋ค. ๊ฐ๋ณ ์ง์ญ ๋ณ์๋ฅผ ์๋ก์ด ์ค๋ ๋์์ ์บก์ณํ ์ ์๋ค๋ฉด ์์ ํ์ง ์์ ๋์์ ์ํํ ๊ฐ๋ฅ์ฑ์ด ์๊ธด๋ค(์ธ์คํด์ค ๋ณ์๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ํ์ ์กด์ฌํ๋ฏ๋ก ํน๋ณํ ์ ์ฝ์ด ์๋ค).
๋ฉ์๋ ๋ ํผ๋ฐ์ค
๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ด์ฉํ๋ฉด ๊ธฐ์กด์ ๋ฉ์๋ ์ ์๋ฅผ ์ฌํ์ฉํด์ ๋๋ค์ฒ๋ผ ์ ๋ฌํ ์ ์๋ค. ๋๋ก๋ ๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ๋ ์ฑ์ด ์ข์ผ๋ฉฐ ์์ฐ์ค๋ฌ์ธ ์ ์๋ค.
// ๊ธฐ์กด ์ฝ๋
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
// ๋ฉ์๋ ๋ ํผ๋ฐ์ค์ java.util.Comparator.comparing์ ํ์ฉํ ์ฝ๋
inventory.sort((comparing(Apple::getWeight());
๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ ํน์ ๋ฉ์๋๋ง์ ํธ์ถํ๋ ๋๋ค์ ์ถ์ฝํ์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค. ์๋ฅผ ๋ค์ด Apple::getWeight
๋ Apple
ํด๋์ค์ ์ ์๋ getWeight
์ ๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ค. ์ค์ ๋ก ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์๋๋ฏ๋ก ๊ดํธ๋ ํ์์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ ๋๋ค ํํ์ (Apple a) -> a.getWeight()
๋ฅผ ์ถ์ฝํ ๊ฒ์ด๋ค.
๋๋ค์ ๋ฉ์๋ ๋ ํผ๋ฐ์ค ๋จ์ถ ํํ ์์
๋๋ค | ๋ฉ์๋ ๋ ํผ๋ฐ์ค ๋จ์ถ ํํ |
---|---|
(Apple a) -> a.getWeight() | Apple::getWeight |
() -> Thread.currentThread().dumpStack() | Thread.currentThread()::dumpStack |
(str, i) -> str.substring(i) | String::substring |
(String s) -> System.out.println(s) | System.out::println |
๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
๋ฉ์๋ ๋ ํผ๋ฐ์ค๋ ์ธ ๊ฐ์ง ์ ํ์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ค. โ์ ์ ๋ฉ์๋ ๋ ํ๋ฐ์คโ, โ๋ค์ํ ํ์์ ์ธ์คํด์ค ๋ฉ์๋ ๋ ํผ๋ฐ์คโ, โ๊ธฐ์กด ๊ฐ์ฒด์ ์ธ์คํด์ค ๋ฉ์๋ ๋ ํผ๋ฐ์ค'
์์ฑ์ ๋ ํผ๋ฐ์ค
ClassName::new
์ฒ๋ผ ํด๋์ค๋ช
๊ณผ new
ํค์๋๋ฅผ ์ด์ฉํด์ ๊ธฐ์กด ์์ฑ์์ ๋ ํผ๋ฐ์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
Supplier<Apple> c1 = Apple :: new; // ๋ํดํธ ์์ฑ์ Apple()์ ์์ฑ์ ๋ ํผ๋ฐ์ค
Apple a1 = c1.get(); // Supplier์ get ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์๋ก์ด Apple ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
// ์ ์์ ๋ ๋ค์ ์ฝ๋์ ๊ฐ๋ค.
Supplier<Apple> c1 = () -> new Apple(); // ๋๋ค ํํ์์ ๋ํดํธ ์์ฑ์๋ฅผ ๊ฐ์ง Apple์ ๋ง๋ ๋ค.
Apple a1 = c1.get(); // Supplier์ get ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์๋ก์ด Apple ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
Apple(Integer weight)
๋ผ๋ ์๊ทธ๋์ฒ๋ฅผ ๊ฐ๋ ์์ฑ์๋ Function ์ธํฐํ์ด์ค์ ์๊ทธ๋์ฒ์ ๊ฐ๋ค.
Function<Integer, Apple> c2 = Apple :: new; // Apple (Integer weight)์ ์์ฑ์ ๋ ํผ๋ฐ์ค
Apple a2 = c2.apply(110); // Function์ apply ๋ฉ์๋๋ฅผ ๋ฌด๊ฒ๋ฅผ ์ธ์๋ก ํธ์ถํด์ ์๋ก์ด Apple ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
//์ ์์ ๋ ๋ค์ ์ฝ๋์ ๊ฐ๋ค.
Function<Integer, Apple> c2 = (weight) -> new Apple(weight); // ํน์ ๋ฌด๊ฒ์ ์ฌ๊ณผ๋ฅผ ๋ง๋๋ ๋๋ค ํํ์
Apple a2 = c2.apply(110); // Function์ apply ๋ฉ์๋๋ฅผ ๋ฌด๊ฒ๋ฅผ ์ธ์๋ก ํธ์ถํด์ ์๋ก์ด Apple ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค.
๋๋ค, ๋ฉ์๋ ๋ ํผ๋ฐ์ค ํ์ฉํ๊ธฐ
// 1๋จ๊ณ
public class AppleComparator implements Comparator<Apple>{
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
}
inventory.sort(new AppleComparator());
// 2๋จ๊ณ: ์ต๋ช
ํด๋์ค ์ฌ์ฉ
inventory.sort(new Comparator<Apple>(){
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
});
// 3๋จ๊ณ : ๋๋ค ํํ์ ์ฌ์ฉ
inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));
//ํ์ ์ถ๋ก ์ ํตํด ๋ ๊ฐ์ํ
inventory.sort((a1, a2) -> a1.getWeight().compareTo(a2.getWeight()));
inventory.sort(comparing((a) -> a.getWeight()));
// 4๋จ๊ณ : ๋ฉ์๋ ๋ ํผ๋ฐ์ค ์ฌ์ฉ
inventory.sort(comparing(Apple::getWeight));
๋๋ค ํํ์์ ์กฐํฉํ ์ ์๋ ์ ์ฉํ ๋ฉ์๋
์ฌ๋ฌ ๊ฐ์ ๋๋ค ํํ์์ ์กฐํฉํด์ ๋ณต์กํ ๋๋ค ํํ์์ ๋ง๋ค ์ ์๋ค(๋ํดํธ ๋ฉ์๋ ๋๋ถ).
Comparator
์กฐํฉ
// ์ญ์ ๋ ฌ
inventory.sort(comparing(Apple::getWeight)).reversed();
// Comparator ์ฐ๊ฒฐ
inventory.sort(comparing(Apple::getWeight).reversed().thenComparing(Apple::getCountry));
Predicate
์กฐํฉ
// ๋ฐ์ ์ํด
Predicate<Apple> notRedApple = redApple.negate();
// and ์กฐํฉ
Predicate<Apple> redAndHeavyApple = redApple.and(a -> a.getWeight() > 150);
a.or(b).and(c)
๋(a || b) && c
์ ๊ฐ๋ค.
Function
์กฐํฉ
// andThen - ์ฃผ์ด์ง ํจ์๋ฅผ ๋จผ์ ์ ์ฉํ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํจ์์ ์
๋ ฅ์ผ๋ก ์ ๋ฌํ๋ ํจ์๋ฅผ ๋ฐํ
Function<Integer, Integer> f = x -> x+1;
Function<Integer, Integer> g = x -> x*2;
Function<Integer, Integer> h = f.andThen(g);;
int result = h.apply(1); // 4๋ฅผ ๋ฐํ
//compose - ์ธ์๋ก ์ฃผ์ด์ง ํจ์๋ฅผ ๋จผ์ ์คํํ ๋ค์์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ถ ํจ์์ ์ธ์๋ก ์ ๊ณต
Function<Integer, Integer> f = x -> x+1;
Function<Integer, Integer> g = x -> x*2;
Function<Integer, Integer> h = f.compose(g);;
int result = h.apply(1); // 3๋ฅผ ๋ฐํ