자바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 + "입니다. 감사합니다";
}

+ Recent posts