Do it! 알고리즘 입문: 자바 편 (11)[책리뷰 & Book review]
본문 바로가기

컴퓨터공부/책리뷰 & book review

Do it! 알고리즘 입문: 자바 편 (11)[책리뷰 & Book review]

by Life & study 2024. 1. 31.
반응형

 

 

 

List numbers = Arrays.asList(1, 2, 3, 4, 5);
Do it! 알고리즘 입문: 자바 편 (1)[책리뷰 & Book review]


List <Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

 [1, 2, 3, 4, 5]라는 리스트를 생성합니다.

numbers.stream() 리스트를 스트림으로 변환합니다. 

이때 스트림의 요소는 원래 리스트의 요소와 동일합니다.

Stream: 1 → 2 → 3 → 4 → 5

 

 

. map(n -> n * n) 스트림의 각 요소에 제곱 함수를 적용합니다. 

이때 n은 스트림의 현재 요소를 참조하는 변수입니다.

 

제곱 함수를 적용한 결과는 새로운 스트림을 구성합니다.

Stream: 1 → 4 → 9 → 16 → 25

 

. collect(Collectors.toList()) 결과 스트림을 다시 리스트로 변환합니다.

List: [1, 4, 9, 16, 25]

 


System.out.println(squares); 최종 결과 리스트를 출력합니다.

출력: [1, 4, 9, 16, 25]


이 과정을 통해 numbers 리스트의 각 요소를 제곱한 결과를 새로운 리스트로 만드는 것을 볼 수 있습니다.

 

Java 8의 스트림 API를 사용하여 리스트의 각 요소를 제곱

Java 8의 스트림 API를 사용하여 리스트의 각 요소를 제곱하는 작업을 수행합니다. 

n -> n * n 부분은 람다 표현식으로, 각 요소 n에 대해 n * n 연산을 수행합니다.

아래는 코드의 동작 원리를 시간 순서대로 나타낸 텍스트 그림입니다:

1. List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

   - `numbers` 리스트를 생성하고, 이 리스트에 1, 2, 3, 4, 5를 요소로 추가합니다.



2. numbers.stream()

   - `numbers` 리스트를 스트림으로 변환합니다.



3.. map(n -> n * n)

   - 스트림의 `map` 메서드를 호출하고, 이 메서드에 람다 표현식 `n -> n * n`을 전달합니다.
   - 이 람다 표현식은 각 요소 `n`에 대해 `n * n` 연산을 수행합니다.
   - 따라서 이 연산은 `numbers` 리스트의 각 요소를 제곱합니다.



4.. collect(Collectors.toList());

   - 스트림의 `map` 메서드를 호출하고, 이 메서드에 람다 표현식 `n -> n * n`을 전달합니다.
   - 이 람다 표현식은 각 요소 `n`에 대해 `n * n` 연산을 수행합니다.
   - 따라서 이 연산은 `numbers` 리스트의 각 요소를 제곱합니다.



5. List <Integer> squares =...
 

- `squares` 리스트를 생성하고, 이 리스트에 `numbers` 리스트의 각 요소의 제곱을 요소로 추가합니다.



6. System.out.println(squares);

   - `squares` 리스트를 출력합니다. 출력 결과는 [1, 4, 9, 16, 25]입니다.



따라서 n -> n * n 람다 표현식은 numbers 리스트의 각 요소를 제곱하는 데 사용됩니다. 

이 연산은 numbers 리스트를 스트림으로 변환한 후에 수행되며, 그 결과는 새로운 리스트 squares에 저장됩니다.

 

 

 

 

 

 

Java에서. as는 특정 메서드나 클래스

 

Stream (인터페이스)
|
|---- map (메서드): 스트림의 각 요소에 함수를 적용하고, 그 결과로 구성된 새로운 스트림을 반환합니다.
|
|---- filter (메서드): 스트림의 각 요소에 대해 주어진 조건을 만족하는 요소만을 포함하는
새로운 스트림을 반환합니다.
|
|---- collect (메서드): 스트림의 요소를 수집하여 다른 형태의 결과를 생성합니다.
|
|---- forEach (메서드): 스트림의 각 요소에 대해 주어진 작업을 수행합니다.
|
|---- reduce (메서드): 스트림의 요소를 결합하여 단일 결과를 생성합니다.
|
|---- IntStream, LongStream, DoubleStream (인터페이스): 기본 타입을 위한 스트림 인터페이스입니다.

 

Java에서 .as는 특정 메서드나 클래스를 가리키는 것이 아닙니다. 

그러나 스트림 API에서 map이라는 메서드가 있습니다. 

이 메서드는 스트림의 각 요소에 함수를 적용하고, 그 결과로 구성된 새로운 스트림을 반환합니다.

아래는 map 메서드를 사용하는 자바 코드 예제입니다:



Java

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(1, 2, 3, 4, 5);

        List<Integer> squares = numbers.stream()
                                       .map(n -> n * n)
                                       .collect(Collectors.toList());

        System.out.println(squares);  // 출력: [1, 4, 9, 16, 25]
    }
}


AI가 생성한 코드입니다. 신중하게 검토하고 사용하세요. 
위 코드에서

numbers.stream().map(n -> n * n).collect(Collectors.toList());

부분에서 map 메서드를 사용하여 리스트의 각 요소를 제곱하고, 

그 결과로 구성된 새로운 리스트를 생성하였습니다.

따라서 map 메서드는 스트림의 각 요소에 함수를 적용하고, 

그 결과로 구성된 새로운 스트림을 생성하는 데 사용됩니다.

 

 

 

 

스트림과 관련 인터페이스

 

Java의 Stream API는 많은 메서드와 인터페이스를 제공하므로,

모두를 그림으로 표현하는 것은 불가능에 가깝습니다.

 

그러나 가장 중요한 몇 가지 메서드와 인터페이스를 그림으로 표현하면 다음과 같습니다.


Stream 생성
java

List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
Stream<String> stream = list.stream();  // 컬렉션으로부터 스트림 생성
Stream<String> parallelStream = list.parallelStream();  // 병렬 스트림 생성
Stream<Integer> intStream = Stream.of(1, 2, 3, 4, 5);  // 정적 메서드로 스트림 생성


중간 연산
java

stream.filter(s -> s.startsWith("A"))  // 필터링
      .map(String::toUpperCase)  // 매핑
      .sorted()  // 정렬


최종 연산
java

stream.collect(Collectors.toList());  // 컬렉션으로 변환
stream.reduce((a, b) -> a + b);  // 리듀스
stream.forEach(System.out::println);  // 각 요소에 대해 동작 수행


위 코드는 Stream API의 간략한 사용법을 보여주고 있습니다.

 각 메서드는 스트림의 요소에 대해 특정 연산을 수행하거나, 스트림을 다른 형태로 변환합니다.

 이 외에도 flatMap, limit, distinct 등 다양한 메서드가 있습니다.

 

 

Stream API의 각 메서드

 

스트림의. map 메서드와 리스트나 배열로의 변환은 서로 다른 용도로 사용됩니다.

. map: 이 메서드는 스트림의 각 요소에 함수를 적용하고, 그 결과로 구성된 새로운 스트림을 반환합니다. 

즉, 원래 스트림의 요소를 변환하는 데 사용됩니다.


java

List<String> words = Arrays.asList("Apple", "Banana", "Cherry");
Stream<String> upperCaseWords = words.stream()
                                      .map(String::toUpperCase);
// upperCaseWords는 "APPLE", "BANANA", "CHERRY"를 요소로 가진 스트림입니다.


위 코드에서 map(String::toUpperCase)는 스트림의 각 요소를 대문자로 변환하는 함수를 적용하고,

 그 결과로 구성된 새로운 스트림을 반환합니다.

toList나 toArray: 이들 메서드는 스트림의 요소를 수집하여 리스트나 배열로 변환하는 데 사용됩니다.


java

List<String> upperCaseList = upperCaseWords.collect(Collectors.toList());
// upperCaseList는 "APPLE", "BANANA", "CHERRY"를 요소로 가진 리스트입니다.

String[] upperCaseArray = upperCaseWords.toArray(String[]::new);
// upperCaseArray는 "APPLE", "BANANA", "CHERRY"를 요소로 가진 배열입니다.


위 코드에서 collect(Collectors.toList())는 스트림의 요소를 리스트로 수집하고,

 toArray(String []::new)는 스트림의 요소를 배열로 수집합니다.

따라서,. map은 스트림의 요소를 변환하고, toList나 toArray는 스트림을 리스트나 배열로 변환합니다.

 이 두 가지 동작은 서로 다른 목적을 가지고 있으며, 필요에 따라 적절히 사용해야 합니다.


스트림(Stream)과 배열(Array)은 자바에서 데이터를 저장하고 처리하는 두 가지 다른 방법입니다.

배열(Array): 배열은 고정된 길이의 데이터 구조로, 같은 타입의 여러 값들을 저장할 수 있습니다. 배열의 크기는 선언 시에 결정되며, 이후에는 변경할 수 없습니다. 배열의 각 요소는 인덱스를 통해 직접 접근할 수 있습니다.
java

String[] fruits = new String[]{"Apple", "Banana", "Cherry"};
System.out.println(fruits[0]);  // 출력: Apple


스트림(Stream): 스트림은 Java 8에서 도입된 개념으로, 데이터의 흐름을 처리하기 위한 인터페이스입니다. 스트림은 데이터를 저장하지 않으며, 데이터에 대한 연산을 지연(lazy)하여 필요한 시점에만 수행합니다. 스트림은 한 번 사용하면 닫히며, 재사용할 수 없습니다. 스트림의 요소에는 인덱스가 없으며, 순차적으로 처리합니다.
java

Stream<String> fruitStream = Stream.of("Apple", "Banana", "Cherry");
fruitStream.forEach(System.out::println);  // 출력: Apple, Banana, Cherry


따라서, "APPLE", "BANANA", "CHERRY"를 요소로 '가진 스트림'과 '가진 배열'은 서로 다르게 동작합니다. 배열은 인덱스를 통한 직접적인 접근이 가능하고 재사용할 수 있지만, 스트림은 한 번만 사용할 수 있으며 순차적인 접근만 가능합니다. 또한 스트림은 데이터를 처리하는 도중에 변환, 필터링 등의 연산을 수행할 수 있습니다.

 

 

 

반응형

댓글