Java8 - Stream 활용 (2): Quiz (2)


Java8 - Stream 활용 (2): 리듀싱, 숫자형 스트림, 스트림 생성3.4. 함수로 무한 스트림 생성 과 관련된 퀴즈 포스트입니다.

소스는 github 에 있습니다.


피보나치 수열과 피보나치 수열 집합 구하기

피보나치 수열
첫째 및 둘째 항이 1이며 그 뒤의 모든 항은 바로 앞 두 항의 합인 수열이다.
0,1,1,2,3,5,8,13,21,… 처음 여섯 항은 각각 1, 1, 2, 3, 5, 8이다.
편의상 0번째 항을 0으로 두기도 한다.

피보나치 수열 집합: (0,1), (1,1), (1,2), (2,3), (3,5)…

T -> T 의 함수 디스크립터를 갖는 UnaryOperator<T> 를 인수로 받는 Stream.iterate() 를 이용한다.
(0,1) 과 같은 집합을 만든 후 이것을 초기값으로 사용한다.

new int[]{0,1}

UnaryOperator<T> 에 관련된 내용은 Java8 - 람다 표현식 (1): 함수형 인터페이스, 형식 검사2.4. 기본형(primitive type) 특화 를 참고하세요.


피보나치 수열 집합 (Stream.iterate())

Stream.iterate(new int[]{0,1}, t -> new int[]{t[1], t[0]+t[1]})
        .limit(20)
        .forEach(t -> System.out.println("(" + t[0] + "," + t[1] + ")"));
(0,1)
(1,1)
(1,2)
(2,3)
(3,5)
...

피보나치 수열 (Stream.iterate())

List<Integer> fib = Stream.iterate(new int[]{0,1}, t -> new int[]{t[1], t[0]+t[1]})
        .limit(10)
        .map(t -> t[0])
        .collect(Collectors.toList());

// [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
System.out.println(fib);

피보나치 수열 (Stream.generate())

기존의 수열 상태를 저장하고, getAsInt() 로 다음 요소를 계산할 수 있도록 IntSupplier 를 만들어야 함

IntSupplier fib2 = new IntSupplier() {
  private int previous = 0;
  private int current = 1;
  @Override
  public int getAsInt() { // 객체 상태가 바뀌며 새로운 값 생성
    int oldPrevious = this.previous;
    int nextValue = this.previous + this.current;
    this.previous = this.current;
    this.current = nextValue;

    return oldPrevious;
  }
};

IntStream fib2Stream = IntStream.generate(fib2)
        .limit(10);

fib2Stream.forEach(System.out::println);

참고 사이트 & 함께 보면 좋은 사이트

본 포스트는 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트 저자의 Java 8 in Action을 기반으로 스터디하며 정리한 내용들입니다.






© 2020.08. by assu10

Powered by assu10