정렬
- 중간 단계에서 요소를 정렬해서 최종 처리 순서를 변경할 수 있음.
- 객체요소일 경우 클래스가 Comparable을 구현하지 않으면 ClassCastException 발생
Comparable 인터페이스를 구현한 Student 클래스
public class Student implements Comparable<Student>{
String name;
int score;
public Student(String name, int score) {
super();
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public int compareTo(Student o) {
return Integer.compare(score,o.score);
}
}
예제 : 숫자요소는 오름차순, Student 객체 요소는 점수를 기준으로 오름차순!
public class SortingExample {
public static void main(String[] args) {
//숫자 요소일 경우
IntStream intStream = Arrays.stream(new int[] {5,3,2,1,4});
intStream
.sorted().forEach(n->System.out.print(n+","));//오름차순
System.out.println();
//객체요소일 경우
List<Student> studentList = Arrays.asList(
new Student("가나다",30),
new Student("라마바",10),
new Student("사아자",20)
);
studentList.stream() //점수를 기준으로 오름차순 정렬
.sorted().forEach(n -> System.out.print(n.getScore()+","));
System.out.println();
studentList.stream() //점수를 기준으로 내림차순 정렬.
.sorted(Comparator.reverseOrder())
.forEach(n-> System.out.print(n.getName()+"/"+n.getScore()+","));
}
}
//1,2,3,4,5,
//10,20,30,
//가나다/30,사아자/20,라마바/10,
루핑
- 요소 전체를 반복하는 것
- peek() 메소드는 중간처리 메소드, 중간처리 단계에서 요소를 루핑하면서 추가적인 작업을 하기 위해 사용. 마지막에 사용하면 실행 안됨.(최종X)
- forEach() 메소드는 최종 처리 메소드, 이후에 다른 최종메소드 호출 불가
예제 : peek 중간호출, peek로 출력 후 결과집합 호출, forEach로 최종 출력.
public class LoopingExample {
public static void main(String[] args) {
int[] intArr = {1,2,3,4,5};
System.out.println("[peek()를 마지막에 호출한 경우]");
Arrays.stream(intArr)
.filter(a -> a%2 ==0)
.peek(n ->System.out.println(n)); //동작하지 않음.
System.out.println("--");
System.out.println("[최종 처리 메소드를 마지막에 호출한 경우]");
int total = Arrays.stream(intArr)
.filter(a -> a%2==0 ) //2의 배수만
.peek(n -> System.out.println(n)) //동작함
.sum();
System.out.println("총합 : "+total);
System.out.println("[forEach()를 마지막에 호출한 경우]");
Arrays.stream(intArr)
.filter(a-> a%2==0 ) //2의 배수만
.forEach(n -> System.out.println(n));
}
}
[peek()를 마지막에 호출한 경우]
--
[최종 처리 메소드를 마지막에 호출한 경우]
2
4
총합 : 6
[forEach()를 마지막에 호출한 경우]
2
4
매칭
- 최종 처리 단계에서 요소들이 특정 조건에 만족하는지 조사할 수 있도록 세가지 매칭 메소드 제공
- allMatch() : 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하는지 조사
- anyMatch() : 최소한 한 개의 요소가 매개값으로 주어진 Predicate의 조건을 만족하는지 조사
- noneMatch() : 모든 요소들이 매개값으로 주어진 Predicate의 조건을 만족하지 않는지 조사
public class MatchExample {
public static void main(String[] args) {
int[] intArr = {2,4,6};
boolean result = Arrays.stream(intArr)
.allMatch( a-> a%2==0);
System.out.println("모두 2의 배수인가? "+result);
result = Arrays.stream(intArr)
.anyMatch( a-> a%3==0);
System.out.println("하나라도 3의 배수가 있는가 ? "+result);
result = Arrays.stream(intArr)
.noneMatch(a->a%3==0);
System.out.println("3의 배수가 없는가? "+ result);
}
}
//모두 2의 배수인가? true
//하나라도 3의 배수가 있는가 ? true
//3의 배수가 없는가? false
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Stream] 집계, Optional 클래스, 커스텀 집계(reduce) (0) | 2019.09.19 |
---|---|
[Java 알고리즘] x만큼 간격이 있는 n개의 숫자, 프로그래머스 level1 (0) | 2019.09.18 |
[Stream] 필터링, 매핑( flatMapXX(), mapXX(), boxed(), distinct(), filter() ) 관련 스트림 메소드 (0) | 2019.09.17 |
[Stream] 스트림의 종류(Stream, BaseStream) (0) | 2019.09.15 |
[Java] Thread#6, 스레드 풀 예제 및 개념(Future 객체, execute(), submit()) (0) | 2019.09.11 |