@FunctionalInterface
: 어노테이션을 달아두면 함수형 인터페이스라는 것을 표시할 수 있다.매개변수를 받아서 소비하는 업무를 구현한다.
acceptXXX() 추상 메소드 제공한다.
종류
Consumer<T>
Biconsumer<T>
IntConsumer
예제 코드
Consumer<Integer> c1 = num -> System.out.println(num*num);
c1.accept(10);
Consumer<String> c2 = str -> System.out.println(str.length());
c2.accept("문자열");
매개변수 없이 반환값을 돌려주는 업무를 구현
getXXX() 추상 메소드 제공
종류
- Supplier<T>
예제 코드
Supplier<Integer> s1 = () -> 100;
System.out.println(s1.get());
Supplier<String> s3 = () -> "홍길동";
System.out.println(s3.get());
매개변수를 전달하면 처리 후, 반환값을 돌려주는 업무를 구현
applyXXX() 추상 메소드 제공
종류
Function<T,R>
: T 자료형을 매개변수로 받아 R 자료형을 반환한다.BiFunction<T,U,R>
: T,U 자료형을 매개변수로 받아 R 자료형을 반환한다.예제 코드
Function<Integer, Boolean> f1 = num -> num>0;
System.out.println(f1.apply(-10));
BiFunction<Integer, Integer, Integer> bf1 = (a,b) -> a+b;
System.out.println(bf1.apply(10, 20));
DoubleToIntFunction f4 = num -> (int)num;
System.out.println(f4.applyAsInt(3.14));
false
30
3
매개변수를 전달하면 처리 후, 반환값을 돌려주는 업무를 구현
applyXXX() 추상 메소드 제공
Function의 하위셋 : 특정 역할만 하도록 특화시킨 인터페이스
매개변수와 반환값의 타입이 같다.
종류
- BinaryOperator<t>
예제 코드
//1. BiFunction
BiFunction<Integer, Integer, Integer> bf1 = (a,b) -> a+b;
//2. BinaryOperator
BinaryOperator<Integer> bo1 = (a,b) -> a+b;
System.out.println(bo1.apply(10, 20));
30
매개변수를 전달하면 처리 후, 반환값을 돌려주는 업무를 구현
applyXXX() 추상 메소드 제공
매개변수를 전달받아, Boolean 반환
Function 하위셋
종류
- Predicate<T>
예제 코드
//1. Function
Function<Integer, Boolean> f1 = num -> num>0;
//2. Predicate
Predicate<Integer> p1 = num -> num>0;
System.out.println(p1.test(10));
//3. Predicate
BiPredicate<Integer, Integer> bp2 = (a,b) -> a>b;
System.out.println(bp2.test(10, 20));
System.out.println(bp2.test(20, 10));
false
false
true
//1. 순수배열로부터
int[] nums1 = {10,20,30,40};
Arrays.stream(nums1).forEach(num -> System.out.println(num));
//2. 컬렉션으로부터
ArrayList<Integer> num2 = new ArrayList<Integer>();
num2.add(100);
num2.add(200);
num2.add(300);
num2.stream().forEach(num -> System.out.println(num));
//3. 숫자범위로부터
//Stream<Integer> : 범용 스트림 > forEach > Consumer<Integer>
//IntStream : 전용 스트림 > forEach > IntConsumer
IntStream
.range(1, 10) //1~9
.forEach(num -> System.out.print(num));
filter()
: 필터링distinct()
: 중복 제거map()
, mapXXX()
: 변환 작업sorted()
: 정렬forEach()
: 요소처리allMatch()
: 모든 요소가 조건을 100% 만족anyMatch()
: 일부 요소가 조건을 만족noneMatch()
: 모든 요소가 조건을 불만족count()
, max()
, min()
, sum()
, average()
//짝수만 출력
list.stream().filter(num -> num % 2 ==0).forEach(num -> {
System.out.printf("%-4d", num);
});
//체중 70kg 이상인 여성 출력
Data.getUserList().stream()
.filter(user -> user.getWeight() >= 70)
.filter(user -> user.getGender() == 2)
.forEach(user -> System.out.print(user + " "));
//중복된 이름 제거
String[] names = {"홍길동", "아무개","이순신","권율","강감찬","연개소문","홍길동","이순신", "남궁장군","연개소문"};
Arrays.stream(names)
.distinct()
.filter(str -> str.length() == 3)
.forEach(str -> System.out.println(str));
//names에서 이름만 추출
String[] names = {"홍길동", "아무개","이순신","권율","강감찬","연개소문","홍길동","이순신", "남궁장군","연개소문"};
Arrays.stream(names)
.map(name -> name.substring(1))
.forEach(name -> System.out.println(name));
//오름차순
Data.getIntList(10)
.stream()
.sorted()
.forEach(n-> System.out.println(n));
//내림차순
Data.getIntList(10)
stream()
sorted((a,b) -> b-a)
forEach(n-> System.out.println(n));
int[] nums = {2,2,34,4,50};
//배열에서 짝수만 들어있는지 체크
System.out.println(Arrays.stream(nums).allMatch(n-> n%2 == 0)); //true
if (Arrays.stream(nums).allMatch(n-> n%2 == 0)) {
System.out.println("짝수 배열");
} else {
System.out.println("홀수 발견");
}
System.out.println(Arrays.stream(nums).noneMatch(n-> n%2 == 0)); //모두가 짝수가 아닌지 체크
true
짝수 배열
false
System.out.println(Data.getIntList().stream().count());
System.out.println(Data.getIntList().stream().max((a,b)-> a-b)); //Optional[99]
System.out.println(Data.getIntList().stream().max((a,b)-> a-b).get());
System.out.println(Data.getIntList().stream().min((a,b)-> a-b).get());
//sum(), average() > 전용 메소드 통해 사용할 수 있다.
int sum = Data.getIntList().stream()
.mapToInt(n-> n) //Stream<Integer>(x) IntStream(o)
.sum();
System.out.println(sum);
double avg = Data.getIntList().stream()
.mapToDouble(n->n)
.average().getAsDouble();
System.out.println(avg);
100
Optional[99]
99
0
4746
47.46