์๋ก
์ฌ๋ด ์ฝ๋๋ฅผ ์ดํด๋ณด๋ค๊ฐ ํจ์ํ ์ธํฐํ์ด์ค, ๊ทธ์ค์์๋ BiFunction<T, U, R>์ ์ฌ์ฉํ ๋ก์ง์ ์์ฃผ ๋ณผ ์ ์์๋๋ฐ, ์ค์ ๋ก ๋ณด๋ ์์ํ๊ธฐ๋ ํ๊ณ , ์ ๋ ๋ก์ง์ ํ๋ฒ ๋
น์ฌ๋ณด๊ณ ์ถ์ด์ ์ด๋ฒ ๊ธฐํ์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
ํจ์ํ ์ธํฐํ์ด์ค ์ข ๋ฅ
Java์ ํจ์ํ ์ธํฐํ์ด์ค๋ JAVA 8๋ถํฐ ๋์
๋ ๊ธฐ๋ฅ์ผ๋ก, ํ๋์ ์ถ์ ๋ฉ์๋๋ง ๊ฐ์ง๋ ์ธํฐํ์ด์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ฌํ ์ธํฐํ์ด์ค๋ค์ ๋๋ค ํํ์์ด๋ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ํตํด ๊ฐ๋จํ๊ฒ ํํํ ์ ์์ผ๋ฉฐ, Java์์๋ java.util.function ํจํค์ง๋ฅผ ํตํด ๋ฏธ๋ฆฌ ์ ์๋ ๋ค์ํ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
Java์์ ๋ฏธ๋ฆฌ ์ ์ํด ๋ ์ฃผ์ ํจ์ํ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Function<T, R>: ์
๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ R์ ๋ฐํํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค. ์ฃผ๋ก ๋ฐ์ดํฐ ๋ณํ ์์
์ ์ฌ์ฉ๋๋ค.
- R apply(T t)
- BiFunction<T, U, R>: ๋ ๊ฐ์ ์
๋ ฅ ์ธ์ T์ U๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ R์ ๋ฐํํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค.
- R apply(T t, U u)
- Consumer<T>: ์
๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค. ๋ฐํ๊ฐ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ์์
์ ์ฌ์ฉ๋๋ค.
- void accept(T t)
- BiConsumer<T, U>: ๋ ๊ฐ์ ์
๋ ฅ ์ธ์ T์ U๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค. ๋ฐํ ๊ฐ์ ์๋ค.
- void accept(T t, U u)
- Supplier<T>: ์
๋ ฅ ์ธ์ ์์ด ๊ฒฐ๊ณผ T๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค. ์ฃผ๋ก ๊ฐ์ ์์ฑํ๊ฑฐ๋ ๊ณต๊ธํ๋ ์์
์ ์ฌ์ฉ๋๋ค.
- T get()
- Predicate<T>: ์
๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ boolean ๊ฐ์ ๋ฐํํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค. ์ฃผ๋ก ์กฐ๊ฑด ๊ฒ์ฌ์ ์ฌ์ฉ๋๋ค.
- boolean test(T t)
- BiPredicate<T, U>: ๋ ๊ฐ์ ์
๋ ฅ ์ธ์ T์ U๋ฅผ ๋ฐ์ boolean ๊ฐ์ ๋ฐํํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค.
- boolean test(T t, U u)
- UnaryOperator<T>: ์
๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ๋์ผํ ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค. Function<T, T>์ ์๋ธ ์ธํฐํ์ด์ค์ด๋ฉฐ, ์ฃผ๋ก ๋จํญ ์ฐ์ฐ ์์
์ ์ฌ์ฉ๋๋ค.
- T apply(T t)
- BinaryOperator<T>: ๋ ๊ฐ์ ์
๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ๋์ผํ ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๋ํ๋ธ๋ค. BiFunction<T, T, T>์ ์๋ธ ์ธํฐํ์ด์ค์ด๋ฉฐ, ์ฃผ๋ก ์ดํญ ์ฐ์ฐ ์์
์ ์ฌ์ฉ๋๋ค.
- T apply(T t1, T t2)
- ์ด ์ธ์ ํจ์๋ค
์์
โญ๏ธ Function<T, R> : ์ ๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ R์ ๋ฐํํ๋ ํจ์, ์ฃผ๋ก ๋ฐ์ดํฐ ๋ณํ ์์ ์ ์ฌ์ฉ
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> strLength = str -> str.length();
System.out.println("Length of 'Hello': " + strLength.apply("Hello")); // ์ถ๋ ฅ: Length of 'Hello': 5
}
}
โญ๏ธ BiFunction<T, U, R>: ๋ ๊ฐ์ ์ ๋ ฅ ์ธ์ T์ U๋ฅผ ๋ฐ์ ๊ฒฐ๊ณผ R์ ๋ฐํํ๋ ํจ์
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println("10 + 20 = " + add.apply(10, 20)); // ์ถ๋ ฅ: 10 + 20 = 30
}
}
โญ๏ธ Consumer<T>: ์ ๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์, ๋ฐํ๊ฐ์ ์์ผ๋ฉฐ, ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ์์ ์ ์ฌ์ฉ
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> printUpperCase = str -> System.out.println(str.toUpperCase());
printUpperCase.accept("hello world"); // ์ถ๋ ฅ: HELLO WORLD
}
}
โญ๏ธ BiConsumer<T, U>: ๋ ๊ฐ์ ์ ๋ ฅ ์ธ์ T์ U๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์, ๋ฐํ ๊ฐ์ ์์
import java.util.function.BiConsumer;
public class Main {
public static void main(String[] args) {
BiConsumer<String, Integer> printNTimes = (str, n) -> {
for (int i = 0; i < n; i++) {
System.out.println(str);
}
};
printNTimes.accept("Hello", 3);
// ์ถ๋ ฅ:
// Hello
// Hello
// Hello
}
}
โญ๏ธ Supplier<T>: ์ ๋ ฅ ์ธ์ ์์ด ๊ฒฐ๊ณผ T๋ฅผ ๋ฐํํ๋ ํจ์, ์ฃผ๋ก ๊ฐ์ ์์ฑํ๊ฑฐ๋ ๊ณต๊ธํ๋ ์์ ์ ์ฌ์ฉ
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<Double> randomSupplier = () -> Math.random();
System.out.println("Random number: " + randomSupplier.get()); // ์ถ๋ ฅ: Random number: 0.123456789 (์์)
}
}
โญ๏ธ Predicate<T>: ์ ๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ boolean ๊ฐ์ ๋ฐํํ๋ ํจ์, ์ฃผ๋ก ์กฐ๊ฑด ๊ฒ์ฌ์ ์ฌ์ฉ
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println("10์ ์ง์์
๋๊น? " + isEven.test(10)); // ์ถ๋ ฅ: 10์ ์ง์์
๋๊น? true
System.out.println("15์ ์ง์์
๋๊น? " + isEven.test(15)); // ์ถ๋ ฅ: 15์ ์ง์์
๋๊น? false
}
}
โญ๏ธ BiPredicate<T, U>: ๋ ๊ฐ์ ์ ๋ ฅ ์ธ์ T์ U๋ฅผ ๋ฐ์ boolean ๊ฐ์ ๋ฐํํ๋ ํจ์
import java.util.function.BiPredicate;
public class Main {
public static void main(String[] args) {
BiPredicate<Integer, Integer> areBothEven = (a, b) -> a % 2 == 0 && b % 2 == 0;
System.out.println("10๊ณผ 20์ ๋ชจ๋ ์ง์์ธ๊ฐ? " + areBothEven.test(10, 20)); // ์ถ๋ ฅ: 10๊ณผ 20์ ๋ชจ๋ ์ง์์ธ๊ฐ? true
System.out.println("10๊ณผ 15์ ๋ชจ๋ ์ง์์ธ๊ฐ? " + areBothEven.test(10, 15)); // ์ถ๋ ฅ: 10๊ณผ 15์ ๋ชจ๋ ์ง์์ธ๊ฐ? false
}
}
โญ๏ธ UnaryOperator<T>: ์ ๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ๋์ผํ ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์, ์ฃผ๋ก ๋จํญ ์ฐ์ฐ ์์ ์ ์ฌ์ฉ
import java.util.function.UnaryOperator;
public class Main {
public static void main(String[] args) {
UnaryOperator<Integer> square = num -> num * num;
System.out.println("5์ ์ ๊ณฑ: " + square.apply(5)); // ์ถ๋ ฅ: 5์ ์ ๊ณฑ: 25
}
}
โญ๏ธ BinaryOperator<T>: ๋ ๊ฐ์ ์ ๋ ฅ ์ธ์ T๋ฅผ ๋ฐ์ ๋์ผํ ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์, ์ฃผ๋ก ์ดํญ ์ฐ์ฐ ์์ ์ ์ฌ์ฉ
import java.util.function.BinaryOperator;
public class Main {
public static void main(String[] args) {
BinaryOperator<Integer> multiply = (a, b) -> a * b;
System.out.println("5 * 10 = " + multiply.apply(5, 10)); // ์ถ๋ ฅ: 5 * 10 = 50
}
}
ํจ์ํ ์ธํฐํ์ด์ค์ ์ฅ์
- ๊ฐ๊ฒฐํ ์ฝ๋: ๋๋ค ํํ์์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ๋์ธ๋ค.
- ๋์ ๋ชจ๋์ฑ: ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์ ํจ์์ ๋์ ๋ชจ๋์ฑ์ ์งํฅํ๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ฌ์์ง๋ฉฐ, ํ ์คํธ์ ๋๋ฒ๊น ์ด ์ฉ์ดํด์ง๋ค.
- ๋ถ๋ณ์ฑ: ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๋ณ๊ฒฝ์ ์ต์ํํ๋ฉฐ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ก ์ธํด ์์ ์ฑ์ด ๋์์ง๋ฉฐ, ๋ฒ๊ทธ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค.
- ๊ณ ์ฐจ ํจ์ ์ฌ์ฉ: ๊ณ ์ฐจ ํจ์๋ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ํจ์๋ฅผ ๋ฐํํ๋ ํจ์์ด๊ธฐ์, ๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์กฐํฉํ๊ฑฐ๋ ์ถ์ํํ์ฌ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
- ์์ฐ์ค๋ฌ์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ: ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ถ์ ํจ๊ณผ(Side Effect)๊ฐ ์๋ ์์ ํจ์๋ฅผ ์ ํธํ๋ฏ๋ก, ๋์์ฑ๊ณผ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ ํฉํ๋ค. ์ด๋ฅผ ํตํด ๋ฉํฐ์ฝ์ด ์์คํ ์์ ์ฑ๋ฅ ํฅ์์ ์ป์ ์ ์๋ค.
- ์ง์ฐ ํ๊ฐ: ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ง์ฐ ํ๊ฐ(Lazy Evaluation)๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋ถํ์ํ ๊ณ์ฐ์ ํผํ๊ณ , ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
- ์ปฌ๋ ์ ์ฒ๋ฆฌ์ ํจ์จ์ฑ: ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ปฌ๋ ์ ์ฒ๋ฆฌ์ ๋ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค. ์คํธ๋ฆผ API๋ฅผ ์ฌ์ฉํ๋ฉด ์ปฌ๋ ์ ์ ์ฝ๊ฒ ์กฐ์ํ๊ณ ๋ฐํํ ์ ์๋ค.
๋ฒ์ธ
์ถ๊ฐ๋ก ์ ๊ฐ ์๊ณ ์ถ์๋ BiFunction์ ๋ํด์ ๋ ์์ธํ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
๋จผ์ BiFunction ์ธํฐํ์ด์ค์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
}
์ฌ๊ธฐ์ T, U, R์ ์ ๋ค๋ฆญ ํ์
์ด๋ฉฐ, ๊ฐ๊ฐ ๋ ๊ฐ์ ์
๋ ฅ ์ธ์์ ๋ฐํ ๊ฐ์ ํด๋นํ๋ ํ์
์ ๋ํ๋
๋๋ค.
BiFunction ์ธํฐํ์ด์ค์๋ ๋ค์ ๋ฉ์๋๋ค์ด ํฌํจ๋์ด ์์ต๋๋ค.
- apply(T t, U u): ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค. ์ด ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ์ค์ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- andThen(Function<? super R, ? extents V> after): ์ด ๋ฉ์๋๋ ํ์ฌ์ BiFunction ์ธ์คํด์ค์ ๋ค๋ฅธ Function ์ธ์คํด์ค๋ฅผ ์ฐ๊ฒฐํ๋ฉฐ, ํ์ฌ ์ธ์คํด์ค์ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ฅธ ํจ์์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ์ต์ข ์ ์ผ๋ก ์๋ก์ด BiFunction ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
// BiFunction ์ธ์คํด์ค ์์ฑ
BiFunction<Integer, Integer, Integer> adder = (a, b) -> a + b;
// apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ซ์๋ฅผ ๋ํจ
int result = adder.apply(5, 3);
System.out.println("5 + 3 = " + result);
// andThen ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ํจ์๋ฅผ ์ฐ๊ฒฐ
BiFunction<Integer, Integer, Integer> multiplier = (a, b) -> a * b;
Function<Integer, String> toString = num -> "๊ฒฐ๊ณผ: " + num;
BiFunction<Integer, Integer, String> combined = adder.andThen(toString);
String combinedResult = combined.apply(5, 3);
System.out.println(combinedResult);
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
5 + 3 = 8
๊ฒฐ๊ณผ: 8
์ ์ฝ๋๋ ๋ ๊ฐ์ BiFunction ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ซ์๋ฅผ ๋ํ ๋ค์, andThen ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ํจ์์ ์ฐ๊ฒฐํฉ๋๋ค.
import java.util.function.BiFunction;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
// ๋ฌธ์์ด ๊ฒฐํฉ BiFunction ์ธ์คํด์ค ์์ฑ
BiFunction<String, String, String> concat = (a, b) -> a + b;
// apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฌธ์์ด์ ๊ฒฐํฉ
String result = concat.apply("Hello, ", "World!");
System.out.println("๊ฒฐ๊ณผ: " + result);
// andThen ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฌธ์ ๋ณํ ํจ์๋ฅผ ์ฐ๊ฒฐ
Function<String, String> toUpperCase = String::toUpperCase;
BiFunction<String, String, String> combined = concat.andThen(toUpperCase);
// ์ฐ๊ฒฐ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๊ฒฐํฉ ๋ฐ ๋๋ฌธ์ ๋ณํ ์ํ
String combinedResult = combined.apply("hello, ", "world!");
System.out.println(combinedResult);
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
๊ฒฐ๊ณผ: Hello, World!
HELLO, WORLD!
์ ์ฝ๋๋ ๋ฌธ์์ด ๊ฒฐํฉ์ ์ํํ๋ BiFunction ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋ค์, apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฌธ์์ด์ ๊ฒฐํฉํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ andThen ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฌธ์ ๋ณํ ํจ์๋ฅผ ์ฐ๊ฒฐํ๊ณ , ์ฐ๊ฒฐ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด ๊ฒฐํฉ๊ณผ ๋๋ฌธ์ ๋ณํ์ ๋์์ ์ํํฉ๋๋ค.
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
// Map ์์ฑ ๋ฐ ๋ฐ์ดํฐ ์ฝ์
Map<String, Integer> map = new HashMap<>();
map.put("A", 10);
map.put("B", 20);
map.put("C", 30);
// BiFunction ์ธ์คํด์ค ์์ฑ
BiFunction<Map<String, Integer>, String[], Integer> sumValues = (m, keys) -> {
int sum = 0;
for (String key : keys) {
sum += m.getOrDefault(key, 0);
}
return sum;
};
// ๋ ํค์ ๋ํ ๊ฐ์ ํฉ๊ณ๋ฅผ ๋ฐํ
String[] keys = {"A", "B"};
int result = sumValues.apply(map, keys);
System.out.println("ํค A์ ํค B์ ๊ฐ์ ํฉ๊ณ: " + result);
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
ํค A์ ํค B์ ๊ฐ์ ํฉ๊ณ: 30
์ ์ฝ๋๋ Map์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ํ, ๋ ํค์ ๋ํ ๊ฐ์ ํฉ๊ณ๋ฅผ ๋ฐํํ๋ BiFunction ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Map๊ณผ ํค ๋ฐฐ์ด์ ์ ๋ฌํ๋ฉด, ํจ์๋ ํค ๋ฐฐ์ด์ ํด๋นํ๋ ๊ฐ๋ค์ ํฉ๊ณ๋ฅผ ๋ฐํํฉ๋๋ค.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
// ๋ ๊ฐ์ ๋ฆฌ์คํธ ์์ฑ
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> list2 = new ArrayList<>(Arrays.asList(4, 5, 6));
// BiFunction ์ธ์คํด์ค ์์ฑ
BiFunction<List<Integer>, List<Integer>, List<Integer>> addLists = (l1, l2) -> {
List<Integer> result = new ArrayList<>();
int size = Math.min(l1.size(), l2.size());
for (int i = 0; i < size; i++) {
result.add(l1.get(i) + l2.get(i));
}
return result;
};
// ๋ ๋ฆฌ์คํธ์์ ๋์ผํ ์ธ๋ฑ์ค์ ์์๋ค์ ๋ํจ
List<Integer> sumList = addLists.apply(list1, list2);
System.out.println("๋ ๋ฆฌ์คํธ์ ์์๋ณ ํฉ๊ณ: " + sumList);
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
๋ ๋ฆฌ์คํธ์ ์์๋ณ ํฉ๊ณ: [5, 7, 9]
์ ์ฝ๋๋ ๋ ๊ฐ์ ์ ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ ํ, ๋์ผํ ์ธ๋ฑ์ค์ ์์๋ค์ ๋ํ๋ BiFunction ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. apply ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฆฌ์คํธ๋ฅผ ์ ๋ฌํ๋ฉด, ํจ์๋ ๊ฐ ์ธ๋ฑ์ค๋ณ ํฉ๊ณ๋ฅผ ๊ฐ์ง ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ฐํํฉ๋๋ค.
๋ํ Java์์ ์ ๊ณตํ๋ ๋ค๋ฅธ ํจ์ํ ์ธํฐํ์ด์ค์ ์กฐํฉํ์ฌ ๋ ๋ณต์กํ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, BiFunction๊ณผ Function ์ธํฐํ์ด์ค๋ฅผ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ค์ํ ์
๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํ์ ์ฒ๋ฆฌํ๋ ํน์ ์์
์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
import java.util.function.BiFunction;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
// BiFunction ์ธ์คํด์ค ์์ฑ
BiFunction<String, Integer, String> repeat = (str, count) -> {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
sb.append(str);
}
return sb.toString();
};
// Function ์ธ์คํด์ค ์์ฑ
Function<String, Integer> countVowels = str -> {
int count = 0;
String vowels = "AEIOUaeiou";
for (char c : str.toCharArray()) {
if (vowels.indexOf(c) != -1) {
count++;
}
}
return count;
};
// ๋ฌธ์์ด ๋ฐ๋ณต ๋ฐ ๋ชจ์ ๊ฐ์ ๊ณ์ฐ
String repeatedStr = repeat.apply("Hello", 3);
int vowelCount = countVowels.apply(repeatedStr);
System.out.println("๋ฐ๋ณต๋ ๋ฌธ์์ด: " + repeatedStr);
System.out.println("๋ชจ์ ๊ฐ์: " + vowelCount);
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ
๋ฐ๋ณต๋ ๋ฌธ์์ด: HelloHelloHello
๋ชจ์ ๊ฐ์: 6
์ ์ฝ๋์์๋ repeat๋ผ๋ BiFunction ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฌธ์์ด์ ์ฃผ์ด์ง ํ์๋งํผ ๋ฐ๋ณตํ๊ณ , countVowels๋ผ๋ Function ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฌธ์์ด์์ ๋ชจ์ ๊ฐ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ทธ ํ, ๋ ํจ์ํ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ฌธ์์ด์์ ๋ชจ์ ๊ฐ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋ฐ๋ผ์ ์ต์ข
์ ์ผ๋ก ๋ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ ๋ฐ๋ณตํ ํ ๋ชจ์ ๊ฐ์๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
์ด์ฒ๋ผ BiFunction์ ๋ค๋ฅธ ํจ์ํ ์ธํฐํ์ด์ค์ ํจ๊ป ์ฌ์ฉํ์ฌ ์์
์ ์กฐํฉํ๊ณ , ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ฐ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ์ด์ ์ ์ ๊ทน ํ์ฉํ์ฌ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ, ํ
์คํธ ์ฉ์ด์ฑ, ์ ์ง ๊ด๋ฆฌ์ฑ์ ๋์ผ ์ ์๊ธฐ์ ์ ์์งํด์ ์ฌ์ฉํ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
'BackEnd๐ฑ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JVM ๋งค๊ฐ๋ณ์] InitialRAMPercentage, MinRAMPercentage, MaxRAMPercentage (0) | 2023.10.01 |
---|---|
Java์์ assert์ exception (0) | 2023.08.11 |
์ผ๊ธ ์ปฌ๋ ์ (First-Class Collection)์ด๋? (0) | 2023.04.12 |
Java์ ์์ธ ์์ฑ ๋น์ฉ์ ๋น์ธ๋ค (0) | 2023.03.10 |
๋๋ฏธํฐ ๋ฒ์น (Law of Demeter)์ด๋? (2) | 2023.02.01 |
์๋ฐ์์ ๋์์ฑ์ ํด๊ฒฐํ๋ ๋ค์ํ ๋ฐฉ๋ฒ๊ณผ Redis์ ๋ถ์ฐ๋ฝ (5) | 2023.01.08 |
๋๊ธ