이야기박스

Effective java 3/E - 람다 & 스트림 (item 42~48) 본문

Programming Language/JAVA

Effective java 3/E - 람다 & 스트림 (item 42~48)

박스님 2018. 12. 20. 14:29
반응형

Item 42. 익명 클래스보다는 람다를 사용하라

자바 컴파일러의 타입 추론은 제네릭 --> 이걸 잘 못쓰면 람다에서 타입 추론이 안됨

==> 제네릭 중요하다


람다 쓸때는 코드는 간결하게

람다 세 줄 넘지 말자 (저자)


람다는 함수형 인터페이스에서만 사용됨

추상 클래스의 인스턴스만들 때, 람다 사용 불가 --> 익명 클래스 사용해야 함

public class Driver {
@Test
public void abstractAnonymousDriver() {
System.out.println(new TestAbstract<String>() {
@Override
public String testAbstractMethod() {
return "testAbstract";
}
});
}

@Test
public void abstractLambdaDriver() {
TestAbstract<String> testAbstract = () -> "testAbstract";
}

@Test
public void interfaceLambdaDriver() {
TestInterface<String> testInterface = () -> "testInterface";

System.out.println(testInterface.testInterfaceMethod());
}
}


람다는 자신을 참조할 수 없음

--> this는 바깥 클래스를 나타냄


* 람다의 변수 사용

--> 클래스 변수는 제약 없이 사용 가능

--> 로컬 변수는 final로 값 변경 불가


람다 & 익명 클래스 모두 직렬화는 지양하자 --> 직렬화 해야 한다면 private 정적 중첩 클래스를 사용하자


Item 43. 람다보다는 메서드 참조를 사용하라

Integer::sum

클래스 이름이 너무 길면, 람다가 더 편할수도...

==> 결국 케바케


* 제네릭 람다식 문법은 없음 


Item 44. 표준 함수형 인터페이스를 사용하라

함수형 인터페이스
Operator
Predicate
Function
Supplier
Consumer

직접 만든 함수형 인터페이스 -->  @FunctionalInterface 사용할 것

다중 정의된 것에서는 확실하게 해줘야 함
--> 예시) ExecutorServie.submit( callable / runnable )
==> 이름 다르게 하자 overloading 하지 맙시다


Item 45. 스트림은 주의해서 사용하라

스트림은 종단연산 수행할 때, 그때만 메모리만 사용

스트림 사용 vs 반복문은 --> 알아서 잘 판단


Item 46. 스트림에서는 부작용 없는 함수를 사용하라

전체 계산 과정을 변환 과정으로 재구성
forEach --> 계산결과를 보고하는데만 사용합시다


Item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다



Item 48. 스트림 병렬화는 주의해서 적용하라



반응형