비교가 필요한 모든 스트림 연산에 사용
비교 기준을 정해주는 방법
비교하고자 하는 객체에 Comparable을 구현
외부에서 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)
};
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()
할때는 비교기준을 정해줘야 한다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를 처리해준다.orElse()
: Optional 타입
에 사용하는 스트림 메서드Collectors.toList()
<- Collectors
라는 클래스에 콜렉터 관련 메서드가 정리되어있음기본형 스트림
으로 맵핑 -> 평균 average().toArray(size -> new String[size])
<- 람다식을 인자로 필요.toArray(String[]::new)
로 축약 가능return arr.length == 0 ? null : Arrays.stream(arr).max().getAsInt();
.max()
는 Optional 타입
을 반환하므로 .getAsInt()
를 추가로 사용.orElse()
는 반환값이 null
인 경우 사용할 수 없다.count >= 3;
<- 문제의 요구값이 Boolean이므로::
축약은 매개변수나 클래스가 필요하다::
: 메서드 레퍼런스
참조