230309 체크포인트

허크·2023년 3월 9일
0

Comparator

비교가 필요한 모든 스트림 연산에 사용

  • 비교 기준을 정해주는 방법

    1. 비교하고자 하는 객체에 Comparable을 구현

    2. 외부에서 Comparator 구현 객체를 만들어서 인자로 전달

1. 비교하고자 하는 객체에 Comparable을 구현

public class LambdaCalculator {
    public static void main(String[] args) {

		Student[] students = new Student[] {
		        new Student("조영현", Gender.MALE, 1),
		        new Student("오숙현", Gender.FEMALE, 6),
		        new Student("노동준", Gender.MALE, 5),
		        new Student("김득렬", Gender.MALE, 6),
		        new Student("황호준", Gender.MALE, 3),
		        new Student("김소희", Gender.FEMALE, 1)
        };
        
        Arrays.stream(students)
        		.sorted()
                .forEach(student -> System.out.printf(
                		"%d : %s\n", student.getWash(), student.getName())
                );
	}
}

enum Gender {
	MALE,
	FEMALE
}

class Student implements Comparable<student>{

    private String name;
    private Gender gender;
    private int wash;

    public Student(String name, Gender gender, int wash) {
        this.name = name;
        this.gender = gender;
        this.wash = wash;
    }

    public String getName() {
        return name;
    }

    public Gender getGender() {
        return gender;
    }

    public int getWash() {
        return wash;
    }
    
    @Override
    public int compareTo(Student o) {
    
    	// 자기 자신의 어떤 값이 매개변수로 들어온 객체의 어떤 값보다 
        // 크다면 양수를,
        // 같다면 0을,
        // 작다면 음수를 리턴해야 한다.
        if (this.wash > o.wash) return 1;
        else if (this.wash == o.wash) return 0;
        else return -1;
    }
}
  • 객체를 sorted() 할때는 비교기준을 정해줘야 한다

2. 외부에서 Comparator 구현 객체를 만들어서 인자로 전달

public class LambdaCalculator {
    public static void main(String[] args) {

		Student[] students = new Student[] {
		        new Student("조영현", Gender.MALE, 1),
		        new Student("오숙현", Gender.FEMALE, 6),
		        new Student("노동준", Gender.MALE, 5),
		        new Student("김득렬", Gender.MALE, 6),
		        new Student("황호준", Gender.MALE, 3),
		        new Student("김소희", Gender.FEMALE, 1)
        };
                
        // 외부에서 Comparator 구현 객체를 만들어서 인자로 전달
 
        Comparator<Student> comparator = new Comparator<Student>() {
        	@Override
            public int compare(Student o1, Student o2) {
                
                return o1.getWash() - o2.getWash();
            }
        };
        
        Arrays.stream(students)
        		.sorted(comparator)
                .forEach(student -> System.out.printf(
                		"%d : %s\n", student.getWash(), student.getName())
                );        
	}
}

enum Gender {
	MALE,
	FEMALE
}

class Student {

    private String name;
    private Gender gender;
    private int wash;

    public Student(String name, Gender gender, int wash) {
        this.name = name;
        this.gender = gender;
        this.wash = wash;
    }

    public String getName() {
        return name;
    }

    public Gender getGender() {
        return gender;
    }

    public int getWash() {
        return wash;
    }
}

+ 람다식으로 정리

  • .sorted((o1,o2)-> o1.getWash() - o2.getWash())
    • sorted() 내부의 처리로 o1, o2를 처리해준다




스트림 연습문제

02

  • .orElse() : Optional 타입에 사용하는 스트림 메서드

03

  • Collectors.toList() <- Collectors 라는 클래스에 콜렉터 관련 메서드가 정리되어있음

05

  • 남성회원들만 필터링 -> 기본형 스트림으로 맵핑 -> 평균 average()

06

  • .toArray(size -> new String[size]) <- 람다식을 인자로 필요
    -> .toArray(String[]::new) 로 축약 가능

08

  • return arr.length == 0 ? null : Arrays.stream(arr).max().getAsInt();
    • .max()Optional 타입을 반환하므로 .getAsInt()를 추가로 사용
    • .orElse()는 반환값이 null인 경우 사용할 수 없다

09

  • .reduce(0, (a, b) -> a > b ? a : b));

10

  • .concat(list1, list2)

12

  • .count >= 3; <- 문제의 요구값이 Boolean이므로



질문 해결

  • System.out::println <- example -> System.out.println(example)
    • :: 축약은 매개변수나 클래스가 필요하다
  • :: : 메서드 레퍼런스 참조
profile
codestates seb 44th // 다크모드로 보는걸 추천드립니다

0개의 댓글