2017년 12월 27일 수요일

Guava와 Java 8

# 과제도 끝났고, 모르던거 살펴보는 중인데.. 아. 부끄러움은 나의 몫이다. Java 8 버전을 쓰고 있지만 정작 편의상 버전만 올렸을 뿐이지 뭐가 어떻게 바뀌었는지 전혀 따라가지 못했다.

# Guava는 JDK에서 제공되지 않는 자주 쓸법한 기능들을 대신 지원해주는 라이브러리이다. 그런데 Java가 8로 업데이트 되면서 Guava에서 제공하던 기능을 유사하게 제공하게 됨에따라 역할이 다소 모호해졌다. (그렇지만 라이브러리 대신 JDK를 써야할 의무는 없고, 모두가 Java 8을 쓰는 것도 아니다.)


Java 8 LocalDate
: 낮은 버전의 Java를 사용해보면 날짜 관련 기능이 굉장히 불편하다 느낄 수 밖에 없는데 Java 8에서 비약적으로 개선되었다. LocalDate, LocalDateTime, LocalTime이 그것이다.
Date, DateTime, Time 버전이 각각 있고, 메서드는 거의 동일하다.

LocalDate day = LocalDate.of(2017, 12, 28);
LocalDate.now(); // ,... LocalDateTime, LocalTime
LocalDate.of(2017, 12, 28).format(DateTimeFormatter.BASIC_ISO_DATE); // 20171228
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));


Guava Strings
: C#에서 자주쓰는 isNullOrEmpty가 참 반갑다.

Strings.isNullOrEmpty(s);
Strings.nullToEmpty(s);
Strings.repeat("-", 70);


Guava Joiner
List<String> parts = ,...
Joiner.on(", ").skipNulls().join(parts);


Guava MapSplitter
MapSplitter splitter = Splitter.on(" ").withKeyValueSeparator(":");
splitter.split("a:1 b:2"); // => Map {a=1, b=2}


Guava Iterable
Iterable<Person> adults = Iterables.filter(persions,
new Predicate<Person>() {
@Override
public boolean apply(Person p) {
return p.getAge() >= 18;
}
});
List<String> names = Lists.newArrayList(Iterables.transform(adults,
new Function<Person, String>() {
@Override
public String apply(Person p) {
return p.getName();
}
}));


Guava FluentIterable
FluentIterable.from(persons)
.filter(new Predicate<Person>() {
@Override
public boolean apply(Person p) {
return p.getAge() >= 18;
}
})
.transform(new Function<Person, String>() {
@Override
public String apply(Person p) {
return p.getName();
}
})
.toList();


Java 8 Lambdas
: 반갑다 람다 :D

Predicate<Person> predicate = p -> p.getAge() >= 18;
Comparator<Person> comparator = (a, b) -> a.getName().compareTo(b.getName());
Runnable runnable = () -> ...;


Guava & Java 8
FluentIterable.from(persons)
.filter((Person p) -> p.getAge() >= 18)
.transform((Person p) -> p.getName())
.toList();
#Eclipse: Quick Fix (Ctrl + 1) -> Convert to lambda expression


Java 8 Streams
: 일반적인 loop 구문과 비교했을 때, 빠르게 동작하진 않는 것 같다. 병렬 버전의 parallelstream도 있다.

persons.stream()
.filter(p -> p.getAge() >= 18)
.map(p -> p.getName())
.collect(Collectors.toList());

List<String> parts = ...;
parts.stream().collect(Collectors.joining(", "));

Map<Integer, List<Person>> personByAge = persons.stream()
.collect(Collectors.groupingBy(p -> p.getAge()));

Double averageAge = persons.stream()
.collect(Collectors.averagingInt(p -> p.getAge()));


Guava Comparing
Ordering.natural()
.onResultOf(new Function<Person, String>() {
public String apply(Person input) {
return input.getName();
}
})
.compound(Ordering.natural()
.onResultOf(new Function<Person, Integer>() {
public Integer apply(Person input) {
return input.getAge();
}
}));


Java8 Comparing
Comparator.comparing(Person::getName)
.thenComparing(Person::getAge);


Guava I/O
List<String> line = Files.readLines(new File(...), Charsets.UTF_8);
Files.copy(new File(...), new File(...));
FluentIterable<File> traversal = Files.fileTreeTraverser().postOrderTraversal(new File("dir"));


Guava Stopwatch
Stopwatch stopwatch = Stopwatch.createStarted();
...
logger.info("Elapsed: " + stopwatch);


Guava Math
IntMath.checkedPow(2, 10); // => 1024
IntMath.divide(7, 2, RoundingMode.HALF_UP); // => 4

출처: https://github.com/robinst/guava-java8-presentation

댓글 없음:

댓글 쓰기