본문 바로가기

자바☕

스트림 API

728x90
class Product {
    private int age;
    private String name;

    public Product(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
}

주로 배열이나 컬렉션에 담긴 데이터를 다룰 때 사용한다.

 

특징 :

스트림은 데이터를 변경하지 않는다. ~ Immutable

재사용이 불가능하다. ~ 최종 연산이 실행된 후 재사용 불가능.

 

스트림 생성 - 중간 연산 - 최종 연산 => 클래스타입.스트림생성().중개연산().최종연산(); ~ 파이프라인 연산 방식

  1. 대표 스트림
    • 중개 연산자
      • 필터링 : filter , distinct
      • 변환 : map , flatMap
      • 제한 : limit , skip
      • 정렬 : sorted
    • 최종 연산
      • 요소 출력 : forEach
      • 요소 검색 : findFirst, findAny
      • 요소 통계 : count, min, max
      • 요소 연산 : sum, average
      • 요소 수집 : collect

실 사용 예제 : 은행관리 프로그램 중

public boolean confirmAccountPwd(String inputAccountNum, String pwd){

        Stream<User> userInfo = userList.stream().filter(s -> s.getAccountNum().equals(inputAccountNum));
        if(userInfo.anyMatch(s -> s.getPwd().equals(pwd))){
            return true;
        }
        System.out.println("계좌의 비밀번호가 틀립니다!");
        return false;

    }

* 중개 연산은 Stream을 반환하고, 최종 연산은 Stream을 반환하는 것이 아니라 Stream의 연산으로 나온 값을 반환한다.

 

예제

filter + anyElement / firstElement

List<String> elements = Stream.of("a", "b", "c")
	.filter(element -> element.contains("b"))
    	.collect(Collectors.toList());

    Optional<String> anyElement = elements.stream().findAny();
    System.out.println(anyElement.orElse("암것두 없어"));

    Optional<String> firstElement = elements.stream().findFirst();
    System.out.println(firstElement.orElse("한개두 없어"));

N개의 중개 연산자

Stream<String> onceModifiedStream = Stream.of("abcd", "bbcd", "cbcd");

Stream<String> twiceModifiedStream = onceModifiedStream.skip(1)
.map(element -> element.substring(0, 3));

System.out.println(twiceModifiedStream); //?
System.out.println(twiceModifiedStream.collect(Collectors.toList()));

map 활용

class Product {
    private int age;
    private String name;

    public Product(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }
}
List<Product> productList = Arrays.asList(new Product(23, "potatoes"),
new Product(14, "orange"), new Product(13, "lemon"),
new Product(23, "bread"), new Product(13, "sugar")
);

List<String> collectorCollection = productList.stream()
				.map(Product::getName)
				.collect(Collectors.toList());

System.out.println(collectorCollection);

double averageAge = productList.stream()
                .collect(Collectors.averagingInt(Product::getAge));
System.out.println("나이 평균 : " + averageAge);

int summingAge = productList.stream().mapToInt(Product::getAge).sum();
        System.out.println("나이 총합 : " + summingAge);
728x90