Study/Java

애너테이션 / 스트림

kahaha 2022. 11. 15. 16:02

# 어노테이션

* 표준 애너테이션 : 특정 프로그램을 위한 주석
- @키워드를 붙여서 사용
- 오버라이딩 시 오타 방지목적 // @Overriding
- 관련경고 억제 // @SuppressWarnings({"deprecation", "unused", "null"}) 
- 함수형 인터페이스의 선언되었는지 확인 // @FunctionalInterface

* 메타 애너테이션 : 애너테이션을 위한 애너테이션, 적용대상 또는 유지기간을 정의
- @Target : 적용할 대상 지정
- @Documented :  javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정
- @Inherited :  하위 클래스가 애너테이션을 상속 / 하위 클래스도 상위 클래스에 붙은 애너테이션들이 동일하게 적용
- @Retention : 애너테이션의 지속 시간을 결정
- @Repeatable : 애너테이션을 여러 번 붙일 수 있도록 허용 // @Repeatable(Works.class) , @Work("코드 업데이트")

* 사용자 정의 애너테이션
- @interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
     타입 요소명(); } // 애너테이션 요소를 선언

# 람다식


* 람다식 : 단 하나의 추상메서드만 정의되어야함
- 메서드를 좀더 간단하고 편리하게 표현하기 위해 고안된 문법요소
- (매개변수 인자) -> { 수행기능 식 정의 / return 생략가능 }
- 실행문이 하나만 존재할 때 중괄호 생략 가능
- 매개변수 타입을 쉽게 유추할 수 있는경우 매개변수 타입 생략 가능 // 많은 경우 유추가 쉬워 대부분 생략 가능
- 람다식은 객체이며 익명클래스라 할 수 있음
- 람다식과 인터페이스의 메서드가 1:1로 매칭되어야함
ExampleFunction exampleFunction = (num1, num2) -> num1 + num2
System.out.println(exampleFunction.sum(10,15))
@FunctionalInterface // 컴파일러가 인터페이스가 바르게 정의되었는 지 확인할 수 있도록
interface ExampleFunction {
public abstract int sum(int num1, int num2); }

- 클래스 :: 메서드 // 정적메서드 참조
- 참조변수 :: 메서드 // 인스턴스 메서드
- IntBinaryOperator operato = Math :: max; //메서드 참조
- 클래스 :: new // 생성자 참조
 Function<String, Member> function1 = Member::new;
    Member member1 = function1.apply("kimcoding");



# 스트림: 컨베이어벨트 처럼 다양한 데이터소스를 통합된 방식으로 핸들링 하기 위함
- 컬렉션들은 모두 .stream 호출 가능
- 사용 예제  Intstream stream = Arrays.stream(arr).forEach(n->n);
- 스트림 인터페이스 안에 다양한 메서드들이 이미 만들어져 있음

* IntStream 인터페이스 // 숫자와 관련된 경우 권장
- sum 과 average 사용가능

* 중간연산
- filter() : 추출 // ex 길이가 5이상인 요소
- map() : 변화 // 객체가 가지고있는 get이나 set등을 호출할 때 사용
- sorted() : 정렬
- .peek() 주로 디버깅할때 사용 // .peek(n-> System.out.println(n))
 
* 최종연산
- .forEach() : 내부요소를 하나씩 꺼낼 때 사용
- .count() : 요소의 개수
- sum() :  요소들의 합
- collect : 최종형태 만들어줌 // .collect(Collectors.toList()); <- 최종형태 리스트

 

스트림 아직은 긴가민가  많이 써봐야 알것같다...