package com.css.stream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.OptionalDouble;
public class StreamMain {
public static void main(String[] args) {
//숫자형태의 문자열 리스트
ArrayList<String> list = new ArrayList<>();
list.add("28");
list.add("2");
list.add("3");
list.add("6");
list.add("5");
list.add("9");
//최종연산을 이용해서 출력
//forEach는 매개변수 1개를 받고 리턴이 없는 메서드를 매개변수로 받음
//collection의 모든 데이터를 매개변수에 대입해서 내용을 수행
//list 안의 데이터를 순차적으로 e에 대입해서 {} 안의 내용을 수행
//최종작업만 수행해서 데이터 출력
// list.stream().forEach(e -> {System.out.println(e);});
//데이터 3개만 출력
// list.stream().limit(3).forEach(e->{System.out.println(e);});
//데이터 정렬 후 출력
// list.stream().sorted().forEach(e->{System.out.println(e);});
//데이터 내림차순 정렬 후 출력
//sorted메서드에 내림차순 정렬을 위한 Comparator 인터페이스를 구현한
//클래스의 객체를 설정하면 된다
//Comparator 인터페이스는 매개변수가 2개이고 정수를 리턴하는 메서드 1개만 존재한다
// list.stream()
// .sorted((o1,o2) -> o2.compareTo(o1))
// .forEach(e->{System.out.println(e);});
//데이터를 정수로 변환해서 정렬
//중간처리 메서드 중에는 Int로 리턴해주는 MapToInt라는 메서드가 존재하고
//이 메서드를 사용할 대는 변환에 사용하는 메서드를 설정만 해주면 된다.
//클래스이름::메서드이름
//문자열을 정수로 변환해서 합계 구하기
// int result = list.stream()
// .mapToInt(Integer::parseInt)
// .sum();
// System.out.println(result);
//홀수의 합
//filter : 조건에 맞는 데이터만 추출
//조건에 맞는 추출하고자 할 때는 하나의 매개변수를 받아서 boolean을 리턴하는
//람다를 만들어서 대입해주면 된다
// int result = list.stream()
// .mapToInt(Integer::parseInt)
// .filter(o -> o%2 == 1)
// .sum();
// System.out.println(result);
//홀수의 평균
//일반적으로 생각하기엔 평균의 결과가 정수나 실수가 나와야하는데
//자바에서는 OptionalDouble이 된다
//Optional이 붙으면 null을 저장할 수 있는 자료형이 되며
//isPresent라는 메서드를 이용해서 null여부를 판단하고
//get이라는 메서드로 데이터를 가져온다.
// OptionalDouble result = list.stream()
// .mapToInt(Integer::parseInt)
// .filter(o -> o%2 == 1)
// .average();
// if( result.isPresent() ) {
// System.out.println(result.getAsDouble());
// }else {
// System.out.println("평균계산 실패 - 아마도 데이터가 없는 것 같음");
// }
//
// System.out.println(result);
//숫자의 경우는 크기비교가 가능해서 별도의 인스턴스를 대입하지 않아도 정렬이 되고
//내림차순을 하고자 하는 경우 reverse옵션을 추가해주면 된다.(Comparator.reverseOrder())
list.stream()
.map(Integer::parseInt)
.sorted(Comparator.reverseOrder())
.forEach(e->{System.out.println(e);});
}
}
package com.css.stream;
import java.util.ArrayList;
public class LoopingMain {
public static void main(String[] args) {
ArrayList <String> list = new ArrayList<>();
list.add("프로그래밍 언어");
list.add("데이터베이스");
list.add("프레임워크");
list.add("소프트웨어 공학");
list.add("Toy Project");
//전체 데이터 출력 - 실행 속도는 가장 빠르지만 list의 데이터 개수가 변경되면 수정을 해야함
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));
System.out.println(list.get(4));
//반복문 이용 - List의 데이터 개수를 이용해서 순회를 하면 list의 데이터 개수가 변경되도 수정할 필요 없음
for( int i = 0 ; i<list.size() ; i++) {
System.out.println(list.get(i));
}
//변하지 않는 메서드의 호출 결과를 반복문에서 여러번 부르는것은 자원의 낭비가 생김
int len = list.size();
for( int i = 0 ; i<len ; i++) {
System.out.println(list.get(i));
}
//모든 데이터를 순회하는 경우라면 빠른 열거를 이용하는것이 효율적이다
for( String job : list) {
System.out.println(job);
}
//빠른 열거는 반복자를 외부에 만들어서 사용하는데 Stream API는 내부 반복자를 사용
//데이터가 많을 때 효율적이다
list.stream().forEach(subject -> {
System.out.println(subject);
});
}
}
댓글