티스토리 뷰

Java

[Stream API] 스트림 만들기

GOMSHIKI 2023. 10. 28. 16:49

스트림 만들기

배열, 컬렉션, 임의의 수 등 다양한 소스를 이용해 스트림을 만들 수 있음. 

 

 

 

1. 컬렉션(Collection)

Collection에 stream()이 정의되어 있는데 그의 자손인 List와 Set을 구현한 컬렉션 클래스는 모두 스트림을 생성 가능

Stream<T> Collection.stream()

 

 

 

2. List 스트림 생성 예시  - list.stream()

public class StreamList{
	
    public static void main(String[] args) {
    
        List<Integer> list = Arrays.asList(1,2,3,4,5);
        Stream<Integer> intStream = list.stream();

        intStream.forEach(System.out::println);
        
    }
}

 

 

 

3. Array 스트림 생성 예시  - Stream.of(), Arrays.stream()

// 스트림 생서 메서드
Stream<T> Stream.of(T... values) // 가변 인자
Stream<T> Stream.of(T[])
Stream<T> Arrays.stream(T[])
Stream<T> Arrays.stream(T[] array, int staticInclusive, int endExclusive)

// 문자열 스트림 예시
Stream<String> strStream = Stream.of("a", "b", "c"); // 가변인자
Stream<String> strStream = Stream.of(new String[]{"a", "b", "c"})
Stream<String> strStream = Arrays.stream(new String[]{"a", "b", "c"})
Stream<String> strStream = Arrays.stream(new String[]{"a", "b", "c"}, 0, 3);

// 기본형 배열 스트림 예시
IntStream IntStream.of(int... values)
IntStream Instream.of(int[])
IntStream Arrays.stream(int[])
IntStream Arrays.stream(int[] array, int staticInclusive, int edExclusive)

 

 

 

4. 특정 범위의 정수 - range(), rangeClosed()

지정된 범위으 연속된 정수를 스트림으로 생성 후 반환하는 메서드 
IntStream     IntStream.range(int begin, int end)
IntStream     IntStream.rangeClosed(int begin, int end)

// 예시 코드
IntStream intStream = IntStream.range(1,5); // 1,2,3,4
IntStream intStream = IntStream.rangeClosed(1, 5); // 1,2,3,4,5

 

 

 

5. 임의의 수 - ints(), longs(), doubles()

1) Random class(난수 생성)에 아래와 같이 인스턴스 메서드가 포함되어 있음 -> ints(), longs(), doubles()

해당 메서드들은 무한 스트림(infinite stream)으로 limit() 메서드를 같이 사용해야함!!

IntStream ints()
LongStream longs()
DoubleStream doubles()

// 사용 예시
IntStream intStream = new Random().ints(); // 무한 스트림
intStream.limit(5).forEach(System.out::println); // 5개 요소만 출력

2) 다음 메서드들은 유한스트림을 생성 -> ints(long size), longs(long size), doubles(long size)

IntStream ints(long streamSize)
LongStream longs(long streamSize)
DoubleStream doubles(long streamSize)

// 사용 예시
IntStream intStream = new Random().ints(5); // 크기가 5인 난수 스트림 생성

 

3) 지정된 범위의 난수 발생 스트림 생성

IntStream ints(int begin, int end)
IntStream longs(long begin, long end)
IntStream doubles(double begin, double end)

IntStream ints(long streamSize, int begin, int end)
IntStream longs(long streamSize, long begin, long end)
IntStream doubles(long streamSize, double begin, double end)

 

 

 

6. 람다식 - iterate(), generate()

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)
static <T> Stream<T> generate(Supplier<T> s)

 

1) iterate() 는 seed 로 지정된 값부터 람다식 f 에 의해 계산된 결과를 다시 seed값으로 해서 계산을 반복

Stream<Integer> evenStream = Stream.iterate(0, n->n+2);
// 0, 2, 4, 6, ...

 

 

2) generate()는 iterate() 처럼 람다식에 의해 계산된 값을 무한 스트림을 생성하지만, 이전 결과를 이용해서 다음 요소로 사용하지 않음

Stream<Double> randomStream = Stream.generate(Math::random);
Stream<Integer> oneStream   = Stream.generate( ()->1 );

▶ generate()에 정의된 매개변수 타입은 Supplier<T>로 매개변수 없는 람다만 허용

▶ iterate()와 generate()에 생성된 스트림은 기본형 스트림 타입으로 반환 불가, 필요 시 mapToInt()와 같은 메서드를 사용해 변환

IntStream evenStream = Stream.iterate( 0, n->n+2 ); // 에러
DoubleStream randomStream = Stream.generate( Math::random ); // 에러

IntStream evenStream = Stream.iterate( 0, n->n+2 ).mapToInt(Integer::valueOf);
Stream<Integer> stream = evenStream.boxed(); // IntStream -> Stream<Integer>

  

7. 파일 - Files.lines()

java.nio.file.Files는 파일을 다루는데 필요한 메서드를 제공.
list()는 지정된 디렉토리(Directory)에 있는 파일 목록을 이용해 스트림으로 생성

 

Stream<Path> Files.list(Path dir)

// 파일의 한행을 요소로 하는 스트림 셍성 메서드 예시
Stream<String> Files.lines(Path path)
Stream<String> Files.lines(Path path, Charset cs)
Stream<String> lines() // BufferedReader 클래스 메서드

 

8. 빈 스트림 - empty()

요소가 없는 스트림을 생성할 수 있는데 스트림 연산 결과가 하나도 없을 때, null 보단 빈 스트림 반환이 더 나음!!
Stream emptyStream = Stream.empty(); // 빈 스트림 생성
long count= emptyStream.count() ; // count = 0

 

 

9. 두 스트림 연결 - concat()

public class StreamStudy {

    public static void main(String[] args) {


        String[] str1 = {"123", "456", "789"};
        String[] str2 = {"ABC", "abc", "DEF"};

        Stream<String> strs1 = Stream.of(str1);
        Stream<String> strs2 = Stream.of(str2);
        Stream<String> strs3 = Stream.concat(strs1, strs2); // 두 스트림을 하나로 연결

        strs3.forEach(System.out::println); // 출력

    }
}

// 출력 결과
// 123
// 456
// 789
// ABC
// abc
// DEF

'Java' 카테고리의 다른 글

[Stream API] 스트림 중간연산 (2/3)  (2) 2023.11.18
[Stream API] 스트림 중간연산 (1/3)  (0) 2023.11.06
[Stream API] 스트림이란?  (0) 2023.10.28
[Generices] 지네릭스  (0) 2023.10.24
[Java] 자바 언어의 특징  (0) 2023.07.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함