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이냐 차이가 있다.
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
flatMap은 람다식에서 입력 T
를 Stream<T>
형태로 반환하면 모든 반환 Stream<T>
를 하나의 Stream<T>
로 펼쳐 준다.
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
flatMapToInt는 바로 모든 IntStream
을 IntStream
으로 반환한다.
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[] 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();
IntStream
을 Stream<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만 나온다.
자바로 알고리즘 문제 풀 때
일단 input을 Wrapper로 바꿔서 풀고 최종 반환에서 원하는 형태로 바꿔주자.