[JAVA]자바의 기본 개념 정리-8.JDK 7과 8의 정리

Java JDK 7과 8의 정리

JDK 7

Type Inference

JDK 7 이전

1
2
Map<String, List<String>> employeeRecords = new HashMap<String, List<String>>();
List<Integer> primes = new ArrayList<Integer>();

JDK 7 이후

1
2
Map<String, List<String>> employeeRecords = new HashMap<>();
List<Integer> primes = new ArrayList<>();

String in Switch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
switch (day) {
case "NEW":
System.out.println("Order is in NEW state");
break;
case "CANCELED":
System.out.println("Order is Cancelled");
break;
case "REPLACE":
System.out.println("Order is replaced successfully");
break;
case "FILLED":
System.out.println("Order is filled");
break;
default:
System.out.println("Invalid");
}

Automatic Resource Management

JDK 7 이전

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    FileInputStream fin = null;
BufferedReader br = null;
try {
fin = new FileInputStream("info.xml");
br = new BufferedReader(new InputStreamReader(fin));
if (br.ready()) {
String line1 = br.readLine();
System.out.println(line1);
}
} catch (FileNotFoundException ex) {
System.out.println("Info.xml is not found");
} catch (IOException ex) {
System.out.println("Can't read the file");
} finally {
try {
if (fin != null)
fin.close();
if (br != null)
br.close();
} catch (IOException ie) {
System.out.println("Failed to close files");
}
}
}

JDK 7 이후

1
2
3
4
5
6
7
8
9
10
11
12
try (FileInputStream fin = new FileInputStream("info.xml");
BufferedReader br = new BufferedReader(new InputStreamReader(
fin));) {
if (br.ready()) {
String line1 = br.readLine();
System.out.println(line1);
}
} catch (FileNotFoundException ex) {
System.out.println("Info.xml is not found");
} catch (IOException ex) {
System.out.println("Can't read the file");
}

Underscore in Numeric literal

1
2
3
4
5
int billion = 1_000_000_000; // 10^9
long creditCardNumber = 1234_4567_8901_2345L; //16 digit number
long ssn = 777_99_8888L;
double pi = 3.1415_9265;
float pif = 3.14_15_92_65f;

JDK 8

Lambda expressions

람다 표현식은 Anonymous Function라고 할 수 있다
람다를 이용하여 코드를 간결하게 할 수 있다

1
2
3
4
5
6
7
8
9
10
11
// Before
Runnable oldRunner = new Runnable(){
public void run(){
System.out.println("I am running");
}
};

// After
Runnable java8Runner = () -> {
System.out.println("I am running");
};

Method Reference

특정 람다 표현식을 축약한 것으로 볼 수 있다
메서드 정의를 활용하여 람다처럼 사용 가능하다

1
2
3
4
5
6
7
8
9
10
11
12
// Before  
inventory.sort((Apple a1, Apple a2) ->
a1.getWeight().compareTo(a2.getWeight()));

// After
inventory.sort(comparing(Apple::getWeight));

/*
Lamda -> Method Reference
(Apple a) -> a.getWeight Apple::getWeight
() -> Thread.currentThread().dumpStack() Thread.currentThread()::dumpStack
*/

Stream

간결하게 컬렉션의 데이터를 처리하는 기능

1
2
3
4
5
6
7
8
9
10
// Before 
List<Shape> list = new ArrayList<Shape>();
for (Shape s : shapes) {
if (s.getColor() == RED) {
list.add(s);
}
}

// After
shapes.stream().filter(s -> s.getColor() == Red).collect(toList());

Default Method

인터페이스의 구현체를 인터페이스 자체에서 기본으로 제공 가능하다
구현 클래스에서 인터페이스를 구현하지 않아도 된다

1
2
3
4
5
6
7
public interface Sized {
int size();

default boolean isEmpty() { // Default Method
return size() == 0;
}
}

Optional

값을 Optional로 캡슐화하여 NullPointerException을 막는다
값이 존재한다면 Optional 클래스는 값을 감싼다
값이 없다면 Optional.empty메서드로 Optional을 리턴한다

New date / time APIs

  • Joda-Time의 많은 기능을 java.time 패키지로 추가했다
    • LocalDate, LocalTime, Instant, Duration, Period …