Record 클래스
기본 문법
Copy record range ( int start , int end){}
단일파일선언
Copy public record range ( int start , int end){}
클래스 내부 선언
Copy public class DidispaceTest {
public record range ( int start , int end){}
}
함수내 선언
Copy public class DidispaceTest {
public void test () {
public record range ( int start , int end){}
}
}
record 키워드는 본질은 불변의 클래스의 선언을 간소화 하기 위함? 이고 특별한 클래스다.
Copy public final class range {
final int start;
final int end;
public range ( int start , int end) {
this . start = start;
this . end = end;
}
@ Override
public boolean equals ( Object o) {
if ( this == o) return true ;
if (o == null || getClass() != o . getClass ()) return false ;
range range = (range) o;
return start == range . start && end == range . end ;
}
@ Override
public int hashCode () {
return Objects . hash (start , end);
}
@ Override
public String toString () {
return "range{" +
"start=" + x +
", end=" + y +
'}' ;
}
public int start (){
return start;
}
public int end (){
return end;
}
}
일부 함수들이 숨김? 으로 되어 있어 range정의시 육안으로 확인할수 없음. 그래서 아래 테스트 코드를 작성해서 확인할수 있다.
Copy @ Test
public void test() {
range r = new range( 100 , 200 ) ;
log . info ( r . toString ());
range r2 = new range( 100 , 200 ) ;
log . info ( String . valueOf ( r . equals (r2)));
}
그리고 record도 클래스 이므로 맴법변수정의도 가능하다.
Copy record range ( int start , int end){
int distance (){
return end - start;
}
}
호출은 아래와 같이
Copy range r = new range( 100 , 200 ) ;
r . distance ();
instanceof 향상
과거 우리는 아래와 같은 코드를 자주 봤었다.
Copy Map < String , Object > data = new HashMap <>();
data . put ( "key1" , "aaa" );
data . put ( "key2" , 111 );
객처에서 값을 구할때 아래와 같은 번거로운 과정을 거쳤다.
Copy Object value = data . get ( "key1" );
if (value instanceof String) {
String s = (String) value;
System . out . println ( s . substring ( 1 ));
}
JAVA16 부터 아래와 같이 개선된 방법으로 작성할수있다.
Copy Object value = data . get ( "key1" );
if (value instanceof String s) {
System . out . println ( s . substring ( 1 ));
}
Stream을 List로 전환시
Stream 을 List 로 전환시 더 이상 collect 할 필요없이 직접 toList 하면 된다.
Copy public class StreamTest {
@ Test
void test () {
List < String > list = List . of ( "blog.didispace.com" , "spring4all.com" , "openwrite.cn" , "www.didispace.com" );
List < String > result = list . stream ()
. filter (e -> e . contains ( "didispace.com" ))
. filter (e -> e . length () > 17 )
. toList ();
System . out . println (result);
}
}
toList() 는 java 16 부터 지원하는 함수이고 stream 을 list로 바로 전화 가능하다.
java8에서는 아래와 같이 처리했을것이다.
Copy List < String > result = list . stream ()
. filter (e -> e . contains ( "didispace.com" ))
. filter (e -> e . length () > 17 )
. collect ( Collectors . toList ());
여기에서 한가지 더 나아가서 Stream.toList() 와 Collectors.toList() 의 차이점은
Stream.toList() 의 구현 소스를 보면
Copy default List< T > toList() {
return ( List< T > ) Collections . unmodifiableList ( new ArrayList <>( Arrays . asList ( this . toArray ())));
}
때문에 Stream.toList()가 생성한 List는 변경불가한 unmodifiableList List 라는것을 알수 있다. 하지만 Stream.collect(Collectors.toList()) 가 생성한 List는 일반적인 List로 당연히 item을 추가,삭제 가능하다.
Collectors 로 변경불가한 List를 생성하려면 어떻게 될까? 바로 Collectors.toUnmodifiableList() 를 사용하면 된다.
때문에 맨 위에 언급된 코드는 아래와 같이 작성하면된다.
Copy List < String > result = list . stream ()
. filter (e -> e . contains ( "didispace.com" ))
. filter (e -> e . length () > 17 )
. collect ( Collectors . toUnmodifiableList ());
위 코드는 java8에는 없는 java10부터 있는 부분이다.