Java/기본

[java] Stream api 사용하기 - 02

vmpo 2021. 10. 1. 15:17

스트림 api에서 사용할 수 있는 중간 연산 처리 메소드를 활용해보도록 하겠습니다.

 

1. 조건문으로 필터링 : filter(), distinct()

2. 리턴 타입을 변환 하거나 데이터를 조작 : map(), flatMap()

3. 개수 제한 : limit(), skip()

4. 정렬 : sorted()

 

1. filter(), distinct() 활용하기

filter의 경우 중간의 특정 조건에 해당하는 데이터만 뽑아낸 새로운 스트림을 생성합니다.

distinct의 경우 중복을 제거합니다.

    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);

    //기본 출력
    list.stream().forEach(System.out::print);
    System.out.println();
    list.stream().filter(i->i>2).forEach(System.out::print);
    System.out.println();
    list.stream().distinct().forEach(System.out::print);

#출력결과

11234
34
1234

 

2. Map(), flatmap() 활용하기

map은 각 스트림의 요소들을 특정 로직으로 변환하여 스트림을 반환합니다.

예를 들어 객체가 저장된 배열에서 각 객체의 이름만 뽑아 내고 싶을때와 같은 상황에서 사용 가능합니다.

 

Stock 클래스를 아래와 같이 생성합니다.

public class Stock {

  int price;
  String name;

  Stock(int price , String name){
    this.price = price;
    this.name = name;
  }

  public int getPrice() {
    return price;
  }

  public void setPrice(int price) {
    this.price = price;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

 

Stock 데이터가 저장된 배열에서 이름만 추출해보도록 하겠습니다. map을 통해 name만 가진 스트림으로 변환 가능합니다.

    List<Stock> list = new ArrayList<>();
    list.add(new Stock(77000, "삼성전자"));
    list.add(new Stock(100000, "하이닉스"));
    list.add(new Stock(110000, "카카오"));
    list.add(new Stock(400000, "네이버"));

    //객체에서 이름만 뽑아냄
    list.stream().map(Stock::getName).forEach(System.out::println);
    //위와 동일함 -> list.stream().map(s->s.getName()).forEach(System.out::println);

 

#출력결과

삼성전자
하이닉스
카카오
네이버

 

flatmap의 경우 단일 배열이 아닐 경우 전체 데이터를 평탄화해 단일 스트림으로 변환해줍니다.

아래와 같이 mainlist는 List를 배열로 가지고 있는 List입니다. mainlist의 모든 Stock 객체의 이름을 추출하고 싶을때

단일 스트림에서만 사용가능만 map으로는 처리 불가능합니다.

flatmap으로 단일 스트림으로 평탄화시켜준 후, map으로 추출 가능합니다.

    List<List<Stock>> mainlist = new ArrayList<>();

    List<Stock> list = new ArrayList<>();
    list.add(new Stock(77000, "삼성전자"));
    list.add(new Stock(100000, "하이닉스"));

    List<Stock> list2 = new ArrayList<>();
    list2.add(new Stock(110000, "카카오"));
    list2.add(new Stock(400000, "네이버"));

    mainlist.add(list);
    mainlist.add(list2);

    mainlist.stream()
            .flatMap(Collection::stream)
            .map(Stock::getName)
            .forEach(System.out::println);

#출력결과

삼성전자
하이닉스
카카오
네이버

 

3. limit(), skip() 활용하기

limit은 스트림의 데이터를 해당 개수 만큼 제한 합니다.

    List<Stock> list = new ArrayList<>();
    list.add(new Stock(77000, "삼성전자"));
    list.add(new Stock(100000, "하이닉스"));
    list.add(new Stock(110000, "카카오"));
    list.add(new Stock(400000, "네이버"));

    list.stream().limit(1).map(Stock::getName).forEach(System.out::println);

#출력결과

삼성전자

 

skip 지정된 개수만큼 앞에서부터 제외하고 나머지 요소를 반환합니다.

    List<Stock> list = new ArrayList<>();
    list.add(new Stock(77000, "삼성전자"));
    list.add(new Stock(100000, "하이닉스"));
    list.add(new Stock(110000, "카카오"));
    list.add(new Stock(400000, "네이버"));

    list.stream().skip(2).map(Stock::getName).forEach(System.out::println);

#출력결과

카카오
네이버

 

4. sorted() 활용하기

sorted() 메소드를 활용하면 데이터 정렬이 가능합니다.

    List<Stock> list = new ArrayList<>();
    list.add(new Stock(77000, "삼성전자"));
    list.add(new Stock(100000, "하이닉스"));
    list.add(new Stock(110000, "카카오"));
    list.add(new Stock(400000, "네이버"));

    System.out.println("가격 순으로 오름차순");
    list.stream()
        .sorted(Comparator.comparing(Stock::getPrice))
        .map(Stock::getName)
        .forEach(System.out::println);
    System.out.println();
    System.out.println("가격 순으로 내림차순");
    list.stream()
        .sorted(Comparator.comparing(Stock::getPrice, Comparator.reverseOrder()))
        .map(Stock::getName)
        .forEach(System.out::println);

#출력결과

가격 순으로 오름차순
삼성전자
하이닉스
카카오
네이버

가격 순으로 내림차순
네이버
카카오
하이닉스
삼성전자

 

LIST