Skip to content

Commit

Permalink
update post
Browse files Browse the repository at this point in the history
  • Loading branch information
sikutisa committed Mar 27, 2024
1 parent 0f70bd4 commit 8bbac50
Show file tree
Hide file tree
Showing 5 changed files with 228 additions and 4 deletions.
2 changes: 1 addition & 1 deletion _posts/2024-03-08-42.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ toc: true
<p>주로 매개값을 리턴값으로 매핑(타입 변환)</p>
</td>
</tr>
<tr>
<tr>
<td>Operator</td>
<td>
<p>매개값도 있고, 리턴값도 있음</p>
Expand Down
6 changes: 3 additions & 3 deletions _posts/2024-03-26-44.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public class Example {
### 내부 반복자를 사용해 병렬 처리가 쉬움

![iterators](/assets/img/posts/44/1.png){: w="330" h = "300"}
_External & Internal Iterator_
*External & Internal Iterator*

- 외부 반복자(External Iterator): 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴
- e.g. index를 사용하는 for, Iterator를 사용하는 while
Expand All @@ -75,7 +75,7 @@ _External & Internal Iterator_
- 내부 반복자는 요소들의 반복 순서를 변경하거나, 멀티 코어 CPU 활용을 위해 요소를 분배, 병렬 작업을 수행하게 도와주기에 순차적 외부 반복자보다 효율적

![parallel](/assets/img/posts/44/2.png){: w="300" h = "300"}
_Parallel in Internal Iterator_
*Parallel in Internal Iterator*

- 병렬 처리 스트림을 사용하면 main 스레드를 포함해 ForkJoinPool(스레드풀)의 작업 스레드들이 병렬적으로 요소를 처리

Expand Down Expand Up @@ -106,7 +106,7 @@ public class Example {
- 최종 처리는 반복, 카운팅, 평균, 총합 등을 수행

![execute](/assets/img/posts/44/3.png){: w="360" h = "300"}
_중간 처리와 최종 처리_
*중간 처리와 최종 처리*

```java
public class Example {
Expand Down
224 changes: 224 additions & 0 deletions _posts/2024-03-28-45.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
---
title: 스트림의 여러 메소드 (1)
author: <author_id>
date: 2024-03-28 02:03:00 +0900
categories: [ProgrammingLanguage, Java]
tags: [programming language, java]
toc: true
---

## 필터링(distinct(), filter())
* 모든 스트림이 가지는 공통 메소드
* **distinct()**: 중복 제거
* Stream의 경우 Object.equals()가 true면 동일 객체로 판단
* IntStream, LongStream, DoubleStream은 동일값일 경우

```java
public class Example {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jack", "Dave", "John");

names.stream()
.distinct()
.forEach(System.out::println);

names.stream()
.filter(n -> n.startWith("J"))
.forEach(System.out::println);

names.stream()
.distinct()
.filter(n -> n.startWith("J"))
.forEach(System.out::println);
}
}
```

## 매핑(flatMapXXX(), mapXXX(), asXXXStream(), boxed())
### flatMapXXX()
* **요소를 대체하는 복수 개의 요소들**로 구성된 새로운 스트림을 반환

![flatmap](/assets/img/posts/45/1.png){: w="360" h = "280"}
*flatmap*

```java
public class Example {
public static void main(String[] args) {
List<String> inputs1 = Arrays.asList("java8 lambda", "stream mapping");
inputs1.stream()
.flatMap(data -> Arrays.stream(data.split(" ")))
.forEach(System.out::println);

List<String> inputs2 = Arrays.asList("10, 20, 30, 40, 50, 60");
inputs2.stream()
.flatMapToInt(data -> {
String[] strArr = data.split(",");
int[] intArr = new int[strArr.length];

for(int i = 0; i < strArr.length; ++i) {
intArr[i] = Integer.parseInt(strArr[i].trim());
}
})
.forEach(System.out::println);
}
}
```

### mapXXX()
* **요소를 대체하는 요소**로 구성된 새로운 스트림 반환

![map](/assets/img/posts/45/2.png){: w="320" h = "280"}
*map*

```java
public class Example {
public static void main(String[] args) {
List<Item> items = Arrays.asList(
new Item("computer", 1000),
new Item("car", 5000),
new Item("cell phone", 500)
);

items.stream()
.mapToInt(Item::getCost)
.forEach(System.out::println);
}
}
```

### asDoubleStream(), asLongStream(), boxed()
* asDoubleStream()은 IntStream의 int 요소 또는 LongStream의 long 요소를 double로 타입 변환해 DoubleStream을 생성
* asLongStream도 마찬가지로 동작
* boxed()는 int, long, double을 Integer, Long, Double로 박싱

```java
public class Example {
public static void main(String[] args) {
int[] arry = {1, 2, 3, 4, 5};

IntStream intStream = Arrays.stream(intArray);
intStream
.asDoubleStream()
.forEach(System.in::println);

intStream = Arrays.stream(intArray);
intStream
.boxed()
.forEach(i -> System.out.println(i.intValue()));
}
}
```

## 정렬(sorted())
* 요소가 최종 처리되기 전에 중간 단계에서 요소를 정렬해 최정 처리 순서를 변경
* 객체 요소일 경우 클래스가 Comparable을 구현하지 않으면 sorted()를 호출했을 때 ClassCastException 발생
* 객체를 Comparable 구현 방법에 따라, 원시 타입 요소를 오름차순에 따라 정렬
* 정렬 방법을 반대로 바꾸고 싶다면 인자로 Comparator.reverseOrder()를 주면 됨
* 인자로 람다식을 넘겨 정렬 기준을 임의로 정할 수도 있음

```java
public class Item implements Comparable<Item> {
private String name;
private int cost;
...
@Override
public int compareTo(Item i) {
return Integer.compare(cost, i.cost);
}
}

public class Example {
public static void main(String[] args) {
IntStream intStream = Arrays.stream(new int[] {5, 4, 3, 2, 1});
intStream
.sorted()
.forEach(System.out::println);

List<Item> items = Arrays.asList(
new Item("computer", 1000),
new Item("car", 5000),
new Item("cell phone", 500)
);

items.stream()
.sorted()
.forEach(i -> System.out.println(i.getCost()));

items.stream()
.sorted(Comparator.reverseOrder())
.forEach(i -> System.out.println(i.getCost()));
}
}
```

## 루핑(peek(), forEach())
* peek()과 forEach()는 요소 전체를 반복한다는 기능에서는 동일
* peek()은 중간 처리, forEach()는 최종 처리 메소드
* peek()은 중간 처리 단계에서 전체 요소를 루핑하면서 추가 작업을 하기 위해 사용
* 최종 처리 메소드가 실행되지 않으면 지연되므로 반드시 최종 처리 메소드가 호출돼야 동작
* forEach는 최종 처리 메소드
* 파이프라인 마지막에 루핑하며 요소를 하나씩 처리
* 요소를 소비하는 최종 처리 메소드이므로 sum()과 같은 다른 최종 메소드를 이후에 호출 불가

```java
// Not Work
intStream
.filter(i -> a % 2 == 0)
.peek(System.in::println);

// Work
intStream
.filter(i -> a % 2 == 0)
.peek(System.in::println)
.sum();

// Error
intStream
.filter(i -> a % 2 == 0)
.forEach(System.in::println)
.sum();
```

```java
public class Example {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};

Arrays.Stream(arr)
.filter(i -> i % 2 == 0)
.peek(System.out::println); // Not Work

int total = Arrays.Stream(arr)
.filter(i -> i % 2 == 0)
.peek(System.out::println)
.sum();

Arrays.Stream(arr)
.filter(i -> i % 2 == 0)
.forEach(System.out::println);
}
}
```

## 매칭(allMatch(), anyMatch(), noneMatch())
* 최종 처리 단계에서 요소들이 특정 조건에 만족하는지 조사
* allMatch(): **모든 요소들**이 주어진 Predicate의 조건을 **만족**하는지 조사
* anyMatch(): **최소 한 개의 요소**가 주어진 Predicate의 조건을 **만족**하는지 조사
* noneMatch(): **모든 요소들**이 주어진 Predicate의 조건을 **만족하지 않는지** 조사

```java
public class Example {
public static void main(String[] args) {
int[] arr = {2, 4, 6};

boolean result = Arrays.stream(arr)
.allMatch(i -> i % 2 == 0);

boolean result = Arrays.stream(arr)
.anyMatch(i -> i % 3 == 0);

boolean result = Arrays.stream(arr)
.noneMatch(i -> i % 3 == 0);
}
}
```
Binary file added assets/img/posts/45/1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/img/posts/45/2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 8bbac50

Please sign in to comment.