java Stream.of/ Arrays.stream/ Integer <-> int

cornpip·2023년 5월 18일
0

자바

목록 보기
18/19
post-thumbnail

Stream

Stream.of/Arrays.stream

		int[] a = {1,2,3};
        int[] b = {4,5};
        
        String a = "hi my  name is";
        String[] b = a.split(" +");
        Stream<String> b1 = Stream.of(b);
        
        //참고
        IntStream stream = Arrays.stream(a);
        Stream<int[]> a1 = Stream.of(a);
        
        int[] c2 = Stream.of(a, b).flatMapToInt((v)->{
            System.out.println(Arrays.toString(v));
            return Arrays.stream(v);
        	}).toArray();
        
        System.out.println(Arrays.toString(c));
       
결과
[1, 2, 3]
[4, 5]
[1, 2, 3, 4, 5]

+)

    Stream<String> b1 = Stream.of(b);
    Stream<String> stream = Arrays.stream(b);
    Stream<Stream<String>> streamStream = stream.map(v -> Stream.of(v));
    Stream<String> stringStream = stream.flatMap(v -> Stream.of(v));

Arrays.stream은 public static <T> Stream<T> stream(T[] array) 다음과 같다.
int[] -> Stream<int>(=IntStream) 이 된다.

Stream.of는 public static<T> Stream<T> of(T t) 다음과 같다.
int[] -> Stream<int[]> 가 된다.
+) String[]은 -> Stream<String>이 된다.

배열 한 겹이 벗겨진 stream이냐 그대로 stream이냐 차이가 있다.

flatMap/flatMapToInt

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
flatMap은 람다식에서 입력 TStream<T> 형태로 반환하면 모든 반환 Stream<T>를 하나의 Stream<T>로 펼쳐 준다.

IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
flatMapToInt는 바로 모든 IntStreamIntStream으로 반환한다.

Integer[][] -> int[][]

    Integer[][] input = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

    int[][] output = Arrays.stream(input)
            .map(row -> Arrays.stream(row)
            	.mapToInt(Integer::intValue)
                .toArray())
                .toArray(int[][]::new);

한 겹을 벗기고 mapToInt를 속에서 해줘야 최종 toArray(int[][]::new)가 가능하다.
mapToInt 람다식에서 int를 만들어서 줘야한다.

    Integer[][] test = new Integer[2][2];
    System.out.println(Arrays.deepToString(test)); //[[null, null], [null, null]]

주의! Integer의 기본 초기값은 null이다.

int[] -> Integer[]

    int[] a = {1,2,3,4};
    Integer[] b = Arrays.stream(a).boxed().toArray(Integer[]::new)
	
    //참고
	IntStream stream = Arrays.stream(a);
    Stream<Integer> boxed = Arrays.stream(a).boxed();

IntStreamStream<Integer>로 바꿔준 후 진행한다.

    Integer[] b = Arrays.stream(a).boxed().toArray(Integer[]::new);
    //Integer[] b = Arrays.stream(a).boxed().toArray(new Integer[]{}); Err
        
    ArrayList<Integer> c = new ArrayList<Integer>();
    c.toArray(new Integer[]{});

(1)(ArrayList).toArray과 (2)(stream).toArray는 다르다.
(1)은 객체 인스턴스도 인자로 받지만 (2)는 intFucntion을 인자로 받는다.

static method는 ctrl+마우스로 계속 따라가볼 수 있다.

interface를 구현한 클래스로 따라가는 방법은 없나?
ex) Stream관련 메서드들은 따라가면 interface만 나온다.

blabla

자바로 알고리즘 문제 풀 때
일단 input을 Wrapper로 바꿔서 풀고 최종 반환에서 원하는 형태로 바꿔주자.

profile
https://cornpip.tistory.com 티스토리로 이전했습니다!

0개의 댓글