- 하나의 메서드만 호출하는 람다식은 '메서드 참조'로 간단히 할 수 있다.
- 메서드 참조 = 클래스이름::메서드이름
- static메서드 참조
Integer method(String s) { // 그저 Integer.parseInt(String s)만 호출 return Integer.parseInt(s); } * method --> int result = Integer.parseInt("123");
↓
Function<String, Integer> f = (String s) -> Integer.parseInt(s);
↓
Function<String, Integer> f = Integer::parseInt; // 메서드 참조
- 생성자와 메서드 참조
Supplier<MyClass> s = () -> new MyClass(); // 매개변수가 없는 경우
↓
Supplier<MyClass> s = MyClass::new;
Function<Integer, MyClass> s = (i) -> new MyClass(i); // 매개변수가 하나 있는 경우
↓
Function<Integer, MyClass> s = MyClass::new;
- 배열과 메서드 참조
Function<Integer, int[]> f = x -> new int[x]; // 람다식 Function<Integer, int[]> f2 = int[]::new; // 메서드 참조 (배열타입[]::new)
- 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
- 데이터 소스 = 컬렉션, 배열
- 스트림으로 작업 처리하기 : 1.스트림만들기 -> 2.중간연산(여러번) -> 3.최종연산(1번)
- 스트림이 제공하는 기능 - 중간 연산과 최종 연산
- 중간연산 - 연산결과가 스트림인 연산. 반복적으로 적용가능
- 최종연산 - 연산결과가 스트림이 아닌 연산. 단 한번만 적용가능(스트림의 요소를 소모)
- 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐 변경하지 않는다.
- 스트림은 Iterator처럼 일회용이다.(필요하면 다시 스트림을 생성해야 함)
- 최종 연산 전까지 중간연산이 수행되지 않는다. - 지연된 연산
- 스트림은 작업을 내부 반복으로 처리한다.
for(String str : strList) System.out.println(str); ---> stream.forEach(System.out::println);
void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); // 매개변수의 널 체크 for(T t : src) // 내부 반복(for문을 메서드 안으로 넣음) action.accept(T);
- 스트림의 작업을 병렬로 처리 - 병렬스트림
Stream<String> strStream = Stream.of("dd", "aaa", "CC", "cc", "b"); int sum = strStream.parallel() // 병렬 스트림으로 전환(속성만 변경) .mapToInt(s -> s.length()).sum(); // 모든 문자열의 길이의 합
- 병렬스트림 = 멀티쓰레드로 작업을 처리한다.
- 기본형 스트림 - IntStream, LongStream, DoubleStream
- 오토박싱&언박싱의 비효율이 제거됨(Stream< Integer > 대신 IntStream 사용)
- 숫자와 관련된 유용한 메서드를 Stream< T >보다 더 많이 제공