실무에서 바로 통하는 자바
책 정보
- 출판사 : 한빛미디어
- 출판년도 : 2017-07-01
- 관련사이트 :
저자 정보
- 원저 : 다케다 하루키 , 와타나베 유지 , 사토 다이치 , 다다 다케아키 , 가미카와 노부히코
- 역자 : 김성훈
1.10 람다식 (Lambda, 흀)
Java8에서 새롭게 추가 된 기능. 간단하게 요약 하면 메소드를 간단히 기술하는 기법
구문 Lambda 식
(자료형 인수, ...) -> { ... 임의의 처리 ...}
|
구현할 인터페이스 코드
package project.lambda;
public interface InterfaceExample{
public abstract void exampleMethod(String name); } |
기본 람다 예제
package project.lambda;
/** * 람다식 예제 입니다. */ public class LambdaExample{ public static void main(String...args){ // 처리를 람다식으로 구현 함. InterfaceExample lambda = (String name) -> { System.out.println("이것이 바로 람다("+name+")입니다"); }; // 람다식을 실행 합니다. lambda.exampleMethod("Lambda ^^"); } } |
이전에는 익명(anonymouse) 클래스로 처리 함
package project.lambda;
/** * 람다식 이전에 람다식 처리를 대신 했던 익명클래스(anonymouse) 방식 * 의 예제 입니다. */ public class AnonymouseExample{ public static void main(String... args){ // 익명클래스를 이용해서 구현 함 InterfaceExample anonymouse = new InterfaceExample(){ public void exampleMethod(String name){ System.out.println("이것이 바로 익명클래스("+name+") 입니다"); } }; // 익명클래스 변수 실행 anonymouse.exampleMethod("anonymouse"); } } |
반환 값의 Lambda 예제들
package project.lambda;
/** * 람다식 반환식 예제 입니다. */ public class LambdaReturnValueExample{ public static void main(String...args){ // 처리를 람다식으로 구현 함. InterfaceReturnValue lambda = (String name) -> { return "("+name+")"; }; // 람다식을 실행 합니다. System.out.println("이것이 바로 람다식"+ lambda.exampleMethod("Lambda ^^")+" 입니다"); // 파라미터 타입을 생략하기 lambda = (name) -> { return "<"+name+">";}; System.out.println("이것이 바로 형생략 람다식"+ lambda.exampleMethod("Lambda ^^")+" 입니다"); // 파라미터가 한 개인 경우 괄호 생략하기 lambda = name -> { return "{"+name+"}";}; System.out.println("이것이 바로 괄호생략 람다식"+ lambda.exampleMethod("Lambda ^^")+" 입니다"); // return 문만 있는 경우의 생략 lambda = name -> "["+name+"]"; System.out.println("이것이 바로 return문 생략 람다식"+ lambda.exampleMethod("Lambda ^^")+" 입니다"); } } /** * 반환값을 갖는 인터페이스 임. */ interface InterfaceReturnValue{ public String exampleMethod(String name); } |
2.2.3 Date-Time API 기초 지식
java8에서 새롭게 추가 API 중. 시차 및 지역별 규칙을 다루기 편하도록 추가됨.
관련 패키지명은 java.time 패키지
주요 클래스에 대한 비교 설명
종류
|
연월일
|
시간
|
일시
|
시차정보
|
지역규칙
|
Local
|
LocalDate
|
LocalTime
|
LocalDateTime
|
X
|
X
|
Zoned
|
-
|
-
|
ZonedDateTime
|
O
|
O
|
Offset
|
-
|
OffsetTime
|
OffsetDateTime
|
O
|
X
|
시차를 다루 방식에 따라 클래스를 구분하는 방식
- 시차를 다루지 않는 경우 Local 로 시작하는 클래스
- 시차를 다루면 Offset으로 시작하는 클래스
- 시차 과 지역규칙을 고려해야 한다면 ZonedDateTime 클래스
추가적인 변화
- 이전과 다르게 Thread Safe가 됨.
- mili second가 아니라 nano second 까지 다룰 수 있음.
기본 사용법
package project.time;
import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.Month; import java.time.ZoneOffset; import java.time.ZonedDateTime; /** * Java8에서 새롭게 추가된 java.time 패키지 클래스 * 기본 예제 * 참고 : 실무에서 바로 통하는 자바 * 출력은 ISO-8601 형식으로 출력됨. */ public class LocalDateTimeExample{ public static void main(String...args){ //시차를 고려하지 않는 날짜와 시간 생성 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println("LocalDateTime 바로 출력 : "+localDateTime); //시차를 고려한 않은 날짜와 시간 생성 - 2019.07.04 12:15:30 OffsetDateTime offsetDateTime = OffsetDateTime.of( 2019, //2019 Month.JULY.getValue(), //7월 혹은 1 ~ 12 4, //day of month , 날짜 12, //24시간 (0 - 23) 17, //분 (0 - 59) 31, //초 (0 - 59) 90, //nano 초 //ZoneOffset.of("+09:00") // 우리나라 표준시와 차이 GMT +9:00 ZoneOffset.ofHours(9) ); System.out.println("OffsetDateTime 바로 출력 : "+offsetDateTime); //시차와 지역규칙을 반영한 날짜와 시간 생성 ZonedDateTime zonedDateTime =
ZonedDateTime.parse("2019-07-04T13:38+09:00[Asia/Seoul]");
System.out.println("ZonedDateTime 바로 출력 : "+zonedDateTime); } } |
기간 구하기(날짜, 시간 간격)
- Period : 날짜 간격
- Duration : 시간 간격
- 예제 코드
package project.time;
import java.time.Duration; import java.time.LocalDateTime; import java.time.Period; /** * 기간 구하는 예제 (Duration , Period 클래스) */ public class DurationPeriodExample{ public static void main(String... args){ LocalDateTime localDateTime1 = LocalDateTime.of(2019, 6, 10, 10, 10, 10, 000000000); LocalDateTime localDateTime2 = LocalDateTime.of(2020, 7, 11, 11, 11, 11, 100000001); Period period = Period.between(localDateTime1.toLocalDate(), localDateTime2.toLocalDate()); System.out.println("-------- period 특정항목의 차이 --------"); System.out.println("년차 : "+period.getYears()); System.out.println("월차 : "+period.getMonths()); System.out.println("일차 : "+period.getDays()); System.out.println("-------- period 누적 달수 --------"); System.out.println("누적 월차 : "+period.toTotalMonths()); Duration duration = Duration.between(localDateTime1, localDateTime2); System.out.println("-------- duration 특정항목의 차이 --------"); System.out.println("나노초차 : "+ duration.getNano()); System.out.println("-------- duration 누적 --------"); System.out.println("누적 일차 : "+duration.toDays()); System.out.println("누적 시간차 : "+duration.toHours()); System.out.println("누적 분차 : "+duration.toMinutes()); System.out.println("누적 초차 : "+duration.getSeconds()); System.out.println("누적 밀리초차 : "+duration.toMillis()); System.out.println("누적 나노초차 : "+duration.toNanos()); // 기간 차이 만큼 더 하기 (2021년 나올 것이다.) LocalDateTime localDateTime3 = localDateTime2.plus(period); System.out.println("-------- period 더하기 --------"); System.out.println("기간 더하기 : "+localDateTime3); } } |
신 <-> 구 날짜 클래스 사이의 변환
Calendar, Date 클래스와 Date-Time API 변환 방향
java.util 클래스
|
변환 방향
|
java.time 의 클래스
|
Date
|
↔️
|
Instant
|
Calendar
|
⟶
|
Instant
|
Calendar, Date 클래스 변환 위한 메서드들
- Date 클래스
- toInstant() : 반환형 java.time.Instant
- from(Instant instant) : 반환형 java.time.Date
- Calendar 클래스
- toInstant() : 반환형 java.time.Instant
예제코드
package project.time;
import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.util.Calendar; import java.util.Date; /** * 기존 날짜,시간 클래스(Date, Calendar) 와 * 새로운 Date-Time(Instant) 변한하는 예제임 */ public class ConvertTimeExample{ public static void main(String...args){ LocalDateTime localDateTime1 = LocalDateTime.of(2025,11,1,2,3,4,567890123); System.out.println("-------- 시작 시의 시간과 날짜 --------"); System.out.println(localDateTime1); Instant instant1 = localDateTime1.toInstant(ZoneOffset.ofHours(9)); // Instant에서 Date로 변환 Date date = Date.from(instant1); System.out.println("-------- java.util.Date의 일시 --------"); System.out.println(date); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); System.out.println("-------- java.util.Calendar의 일시 --------"); System.out.println(calendar); // Date -> Instant Instant instance2 = date.toInstant(); LocalDateTime localDateTime2 = LocalDateTime.ofInstant(instance2, ZoneId.of("Asia/Seoul")); System.out.println("-------- Date -> LocalDateTime 변환의 일시 --------"); System.out.println(localDateTime2); // Calendar -> Instant Instant instance3 = calendar.toInstant(); LocalDateTime localDateTime3 = LocalDateTime.ofInstant(instance3, ZoneId.of("Asia/Seoul")); System.out.println("-------- Calendar -> LocalDateTime 변환의 일시 --------"); System.out.println(localDateTime3); } } |
5.3 Stream API의 병렬 처리
Java8부터 추가된 함수형 인터페이스
관련 패키지는 java.util.function
* 함수형 프로그램밍 이란 ~ SQL에 가까운 프로그래밍 스타일을 의미 함.
Stream API 처리 흐름
- Stream 생성 -> 중간 조작 -> 종단 조작
Stream API에서 사용하는 주요 메소드
- stream 생성 : Stream.of, Stream.generate, List.stream, List.parallelStream
- 중간 조작 : filter , map , sorted , skip
- 종단 조작 : forEach, forEachOrdered, toArray, min , max , count
예제코드
package project.stream;
import java.util.ArrayList; import java.util.Comparator; import java.util.List; /** * Stream API 예제#01 */ public class StreamExampe01 { public static void main(String...args){ // 상품 데이터 리스트를 작성한다. List<Product> productList = new ArrayList<>(); productList.add(new Product("탁자", 30000)); productList.add(new Product("의자", 50000)); productList.add(new Product("전등", 15000)); // 리스트를 병렬 Stream 형태로 변경 productList.parallelStream() // 금액의 순서대로 정렬 //.sorted(Comparator.comparingInt(product->product.getPrice())) .sorted(Comparator.comparingInt(Product::getPrice).reversed()) // 정렬한 결과를 출력 .forEachOrdered(System.out::println); } } /** * 상품 클래스 */ class Product { /** 상품명 */ private String productName; /** 금액 */ private int price; public Product(String productName, int price){ this.productName = productName; this.price = price; } public String getProductName(){ return productName; } public void setProductName(String productName){ this.productName = productName; } public int getPrice(){ return price; } public void setPrice(int price){ this.price = price; } public String toString(){ return String.format("productName=[%s], price=[%d]", productName,price); } } |