자바8 스타일 문법으로 만드는 과정 정리
public class 람다로표현하기 {
public static void main(String[] args) {
List<Banana> basket = new ArrayList<>();
basket.add(new Banana(50));
basket.add(new Banana(40));
System.out.println(basket.get(0));
//1단계코드 동작 파라미터화
basket.sort(new BananaComparator());
System.out.println(basket.get(0).getWeight());
//2단계 익명클래스사용
basket.add(new Banana(30));
basket.sort(new Comparator<Banana>() {
@Override
public int compare(Banana o1, Banana o2) {
return Integer.compare(o1.getWeight(), o2.getWeight());
}
});
System.out.println(basket.get(0).getWeight());
//3단계 람다표현식 사용
basket.add(new Banana(20));
basket.sort((Banana o1, Banana o2)->Integer.compare(o1.getWeight(), o2.getWeight()));
System.out.println(basket.get(0).getWeight());
//4단계 메서드참조 사용
basket.add(new Banana(10));
basket.sort(Comparator.comparing(Banana::getWeight));
System.out.println(basket.get(0).getWeight());
}
}
class BananaComparator implements Comparator<Banana>{
@Override
public int compare(Banana o1, Banana o2) {
return Integer.compare(o1.getWeight(), o2.getWeight());
}
}
class Banana{
private int weight;
public Banana(int weight) {
this.weight = weight;
}
public int getWeight() {
return weight;
}
}
람다표현식을 조합할 수 있는 유용한 메서드
1. Comparator 조합
정적 메서드 Comparator.comparing을 이용해 비교해 사용할 키를 추출하는 Function 기반의 Comparator을 반환할 수 있다
public class Comparator조합 {
public static void main(String[] args) {
List<Bike> cart = new ArrayList<>();
cart.add(new Bike("red",50));
cart.add(new Bike("green", 50));
cart.add(new Bike("white",40));
cart.add(new Bike("black",70));
//Comparator 조합
Comparator<Bike> b = Comparator.comparing(Bike::getWeight);
cart.sort(b);
for (Bike bike: cart) {
System.out.println(bike.getWeight() + ", " + bike.getColor());
}
//역정렬
cart.sort(Comparator.comparing(Bike::getWeight).reversed());
for (Bike bike: cart) {
System.out.println(bike.getWeight() + ", " + bike.getColor());
}
//무게가 같은경우 색으로 정렬
cart.sort(Comparator.comparing(Bike::getWeight).reversed().thenComparing(Bike::getColor));
for (Bike bike: cart) {
System.out.println(bike.getWeight() + ", " + bike.getColor());
}
}
}
class Bike{
public Bike(long weight) {
this.weight = weight;
}
public Bike(String color) {
this.Color = color;
}
public Bike(String color, long weight) {
Color = color;
this.weight = weight;
}
public String getColor() {
return Color;
}
public long getWeight() {
return weight;
}
private String Color;
private long weight;
2. Predicate 조합 negate = 반전, and, or 메서드 제공 람다표현식을 조합해서 더 복잡한 람다 표현식을 만들 수 있다.
System.out.println("Predicate 조합 테스트");
Predicate<Bike> redBike = bike -> bike.getColor().equals("Red");
Predicate<Bike> notRedBike = redBike.negate();
Predicate<Bike> notRedAndHeavy = notRedBike.and(bike -> bike.getWeight() > 50);
Predicate<Bike> notRedAndHeavyOrWhite = notRedAndHeavy.or(bike -> bike.getColor().equals("white"));
List<Bike> filteredCart = cart.stream().filter(notRedAndHeavyOrWhite).collect(Collectors.toList());
for (Bike bike: filteredCart) {
System.out.println(bike.getWeight() + ", " + bike.getColor());
}
3. Function조합
//Function 인터페이스는 Function 인터페이스를 반환하는 andThen, compose 디폴트 메서드를 이용할 수 있다.
//andThen은 함수의 결과를 다른 함수의 입력으로 전달.
//compose는 괄호안의 함수를 먼저 실행한 다음에 리턴을 외부함수의 인수로 제공한다.
//여러 유틸리티 메서드를 조합해서 다양한 변환 파이프라인을 만들 있다
System.out.println("Function 조합 테스트");
Function<Long, String> addHeader = 람다유용한메서드::addheader;
Function<Long, String> infoPipeline = addHeader.andThen(람다유용한메서드::addFooter);
for (Bike bike: filteredCart) {
String info = infoPipeline.apply(bike.getWeight());
System.out.println(info);
}
}
public static String addheader(long weight){
return "자전거의 무게는" + weight;
}
public static String addFooter(String text){
return text + "입니다. 감사합니다";
}