
package me.whiteship.chapter07.item44.custom_functional_interfaces;
import java.util.*;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
public class UnaryOperatorExample {
public static void main(String[] args) {
List<String> words = new ArrayList<>(Arrays.asList("banana", "apple", "cherry"));
System.out.println("Before conversion: " + words);
// Using UnaryOperator to convert the list to uppercase
UnaryOperator<String> toUpperCase = String::toUpperCase; // (s1) -> s1.toUpperCase();
List<String> upperCaseWords = words.stream()
.map(toUpperCase)
.collect(Collectors.toList());
System.out.println("After conversion: " + upperCaseWords);
}
}
type이 1개이다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;
import java.util.*;
import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
public class UnaryOperatorExample {
public static void main(String[] args) {
List<String> words = new ArrayList<>(Arrays.asList("banana", "apple", "cherry"));
System.out.println("Before conversion: " + words);
// Using UnaryOperator to convert the list to uppercase
// UnaryOperator<String> toUpperCase = String::toUpperCase; // (s1) -> s1.toUpperCase();
Function<String, String> toUpperCase = String::toUpperCase;
List<String> upperCaseWords = words.stream()
.map(toUpperCase)
.collect(Collectors.toList());
System.out.println("After conversion: " + upperCaseWords);
}
}
이것도 가능하다.
unary는 인자로 받는게 딱 하나다라는 의미이다.
package me.whiteship.chapter07.item44.custom_functional_interfaces;
import java.util.function.BinaryOperator;
public class BinaryOperatorExample {
public static void main(String[] args) {
// Using BinaryOperator to concatenate two strings
BinaryOperator<String> concatenate = (s1, s2) -> s1 + s2;
String result = concatenate.apply("Hello, ", "world!");
System.out.println(result); // Output: Hello, world!
}
}
Binary에서는 인자로 받는게 2개라는 것이다.

package me.whiteship.chapter07.item44.custom_functional_interfaces;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateExample {
public static void main(String[] args) {
List<String> words = new ArrayList<>(Arrays.asList("banana", "apple", "cherry", "blueberry"));
System.out.println("Original list: " + words);
// Using Predicate to filter the list for words that start with 'b'
Predicate<String> startsWithB = s -> s.startsWith("b");
List<String> filteredWords = words.stream()
.filter(startsWithB)
.collect(Collectors.toList());
System.out.println("Filtered list: " + filteredWords);
}
}

Predicate는 boolean으로 받는다.
package me.whiteship.chapter07.item44.custom_functional_interfaces;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class FunctionExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("banana", "apple", "cherry");
System.out.println("Original list: " + words);
// Using Function to convert the list of strings to their lengths
Function<String, Integer> stringLength = String::length;
List<Integer> lengths = words.stream()
.map(stringLength)
.toList();
System.out.println("Lengths: " + lengths);
}
}
입력이 같지 않은 경우에는 Function으로 정의가 가능하다.
package me.whiteship.chapter07.item44.custom_functional_interfaces;
import java.util.Random;
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
// Using Supplier to generate a random number
Supplier<Integer> randomSupplier = () -> new Random().nextInt(100);
// Getting a random number
Integer randomNumber = randomSupplier.get();
System.out.println("Random number: " + randomNumber);
}
}
인자가 없고 값을 return만 하는 것이다.
package me.whiteship.chapter07.item44.custom_functional_interfaces;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("banana", "apple", "cherry");
System.out.println("Original list: " + words);
// Using Consumer to print each element of the list
Consumer<String> printWord = System.out::println;
words.forEach(printWord);
}
}
전달만 해주는 것이고, return이 없다.
BiConsumer : 2개를 받는거
BiFunction : 2개를 받아서 한개를 return하는 것.
핵심정리 2: 직접 정의해서 사용하는 경우


커스텀한 함수라고 볼 수 있다.
package me.whiteship.chapter07.item44.standard_functional_interfaces;
@FunctionalInterface
public interface TriFunction<T, U, V, R> {
R apply(T t, U u, V v);
}
package me.whiteship.chapter07.item44.standard_functional_interfaces;
public class TriFunctionExample {
public static void main(String[] args) {
// Using TriFunction to concatenate three strings
TriFunction<String, String, String, String> concatenate = (s1, s2, s3) -> s1 + s2 + s3;
String result = concatenate.apply("Hello, ", "world", "!");
System.out.println(result); // Output: Hello, world!
// Using TriFunction to sum three integers
TriFunction<Integer, Integer, Integer, Integer> sum = (a, b, c) -> a + b + c;
Integer sumResult = sum.apply(1, 2, 3);
System.out.println(sumResult); // Output: 6
}
}