Lambda 사용 시나리오 - low-hill/Knowledge GitHub Wiki
Stream API와 Lambda 표현식을 사용하면 읽기 쉬운 간결한 코드로 컬렉션 순회 및 필터링이 가능하다.
List<String> letters= Arrays.asList("a", "b", "c");
for (String letter : letters) {
if (letter.endsWith("c")) {
System.out.println(letter);
}
}
- Lambda 적용
List<String> letters= Arrays.asList("a", "b", "c");
letters.stream()
.filter(letter -> letter.endsWith("c"))
.forEach(System.out::println);
Lambda 표현식으로 보다 간결한 형식으로 정렬 메서드를 사용하여 코드가 더욱 간결해진다.
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
Collections.sort(names, new Comparator<String>() {
public int compare(String name1, String name2) {
return name1.compareTo(name2);
}
});
- Lambda 적용
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
names.sort((name1, name2) -> name1.compareTo(name2));
Stream API와 Lambda로 컬렉션에 대한 집계를(sum, average) 보다 우아하게 구현할 수 있습니다.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = 0;
for (Integer num : numbers) {
sum += num;
}
- Lambda 적용
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, Integer::sum);
Optional 클래스를 사용하여 특정 조건 필터링 및 기본값 설정를 처리한다.
String name = "world";
if (name != null && name.length() > 0) {
System.out.println("Hello, " + name);
} else {
System.out.println("Hello, Stranger");
}
- Lambda 적용
String name = "world";
name = Optional.ofNullable(name)
.filter(n -> n.length() > 0)
.orElse("Stranger");
System.out.println("Hello, " + name);
간결한 코드로 가독성을 향상시킨다.
new Thread(new Runnable() {
public void run() {
System.out.println("Thread is running.");
}
}).start();
- Lambda 적용
new Thread(() -> {
// do something
}).start();
new Thread(() -> System.out.println("Thread is running.")).start();
Lambda의 map()을 사용하여 원소를 변환하여 가독성을 향상 시킨다.
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
List<String> uppercaseNames = new ArrayList<>();
for (String name : names) {
uppercaseNames.add(name.toUpperCase());
}
- Lambda 적용
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
List<String> uppercaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
내부 클래스의 선언 및 구현 없이 간결하게 구현한다. ex) groupingBy、counting、summingInt
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
Map<Integer, List<String>> namesGroupByLength = new HashMap<>();
for (String name : names) {
int length = name.length();
if (!namesGroupByLength.containsKey(length)) {
namesGroupByLength.put(length, new ArrayList<>());
}
namesByLength.get(length).add(name);
}
System.out.println("Names grouped by length: " + namesGroupByLength);
- Lambda 적용
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
Map<Integer, List<String>> namesGroupByLength = names.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println("Names grouped by length: " + namesGroupByLength);
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
int namesStartWithA = 0;
for (String name : names) {
if (name.contains("A")) {
namesStartWithA++;
}
}
System.out.println("Number of names containing 'A': " + namesStartWithA);
- Lambda 적용
List<String> names = Arrays.asList("Aaron", "Bobby", "Charlotte");
long namesStartWithA = names.stream()
.filter(name -> name.contains("A"))
.count();
System.out.println("Number of names containing 'A': " + namesStartWithA);
컬렉션 데이터 양이 많은 경우 Stream API와 Lambda를 사용하여 병렬처리가 쉬워진다. parallelStream()로 백만 개의 정수의 평균을 병렬처리 한다.
List<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
numbers.add(ThreadLocalRandom.current().nextInt(100));
}
//
long startTimeSeq = System.currentTimeMillis();
double averageSequential = numbers.stream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();
long endTimeSeq = System.currentTimeMillis();
System.out.println("Sequential Average: " + averageSequential);
System.out.println("Time taken (Sequential): " + (endTimeSeq - startTimeSeq) + "ms");
//Parallel
long startTimePar = System.currentTimeMillis();
double averageParallel = numbers.parallelStream()
.mapToInt(Integer::intValue)
.average()
.getAsDouble();
long endTimePar = System.currentTimeMillis();
System.out.println("Parallel Average: " + averageParallel);
System.out.println("Time taken (Parallel): " + (endTimePar - startTimePar) + "ms");
Reference