public class DidispaceTest {
public record range(int start, int end){}
}
함수내 선언
public class DidispaceTest {
public void test() {
public record range(int start, int end){}
}
}
record 키워드는 본질은 불변의 클래스의 선언을 간소화 하기 위함? 이고 특별한 클래스다.
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정의시 육안으로 확인할수 없음. 그래서 아래 테스트 코드를 작성해서 확인할수 있다.
@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도 클래스 이므로 맴법변수정의도 가능하다.
record range(int start, int end){
int distance(){
return end - start;
}
}
호출은 아래와 같이
range r = new range(100, 200);
r.distance();
instanceof 향상
과거 우리는 아래와 같은 코드를 자주 봤었다.
Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
객처에서 값을 구할때 아래와 같은 번거로운 과정을 거쳤다.
Object value = data.get("key1");
if (value instanceof String) {
String s = (String) value;
System.out.println(s.substring(1));
}
JAVA16 부터 아래와 같이 개선된 방법으로 작성할수있다.
Object value = data.get("key1");
if (value instanceof String s) {
System.out.println(s.substring(1));
}
Stream을 List로 전환시
Stream 을 List 로 전환시 더 이상 collect 할 필요없이 직접 toList 하면 된다.
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로 바로 전화 가능하다.
때문에 Stream.toList()가 생성한 List는 변경불가한 unmodifiableList List 라는것을 알수 있다. 하지만 Stream.collect(Collectors.toList()) 가 생성한 List는 일반적인 List로 당연히 item을 추가,삭제 가능하다.
Collectors 로 변경불가한 List를 생성하려면 어떻게 될까? 바로 Collectors.toUnmodifiableList() 를 사용하면 된다.