---
sourceDocument: Xanadu API 참조
sourceDocumentLink: https://servicenow-prod.fluidtopics.net/r/ko-KR/xanadu/api-reference

 Release :

    - xanadu

ft:locale :

    - ko-KR

ft:publication_title :

    - Xanadu API 참조

ft:clusterId :

    - crapiref

bundleId :

    - crapiref

workflow :

    - Creator


---

# 스트림 - 범위가 지정됨, 전역

# 스트림 - 범위가 지정됨, 전역 {#ariaid-title1}

* 릴리스 버전: Xanadu
* 
* 업데이트 날짜 2024년 08월 01일
* 
* ![](https://www.servicenow.com/docs/portal-asset/ico-clock) 소요 시간: 22분

Stream API는 레코드와 같은 항목 스트림과 상호 작용하는 메서드를 제공합니다. 예를 들어 forEach() 메서드를 사용하여 GlideQuery API에서 반환한 스트림에 있는 각 레코드의 상태를 업데이트할 수 있습니다.

다음과 같은 방법으로 Stream 개체를 가져올 수 있습니다.  
* 생성자를 사용하여 Stream 개체를 인스턴스화합니다.
* GlideQuery.select() 메서드에서 Stream 객체를 반환합니다. 자세한 내용은 [GlideQuery](https://servicenow-prod.fluidtopics.net/tkBMAt54EDcNiTXYcFWJqQ#GlideQueryGlobalAPI "GlideQuery 스크립트 포함은 서버 측 스크립트의 기록 데이터에 대한 CRUD 작업을 수행하기 위한 GlideRecord API의 대안입니다.")를 참조하십시오.
{#StreamGlobalAPI__ul_d3q_3dl_4mb}

이 메서드는 정적이며 [fromArray()](https://servicenow-prod.fluidtopics.net/C72jmZjJPzL62rBRQKNE1g#Stream-fromArray_O "제공된 배열의 값을 포함하는 Stream 개체를 반환합니다.") 클래스의 인스턴스가 필요하지 않습니다.

범위가 지정된 스크립트 또는 전역 서버 측 스크립트에서 Stream API를 사용합니다. 이 API를 사용하려면 GlideQuery \[com.sn_glidequery\] 플러그인이 필요합니다.

## 구현 {#StreamGlobalAPI__section_wqk_wwv_wmb}

이 API는 [GlideQuery](https://servicenow-prod.fluidtopics.net/tkBMAt54EDcNiTXYcFWJqQ#GlideQueryGlobalAPI "GlideQuery 스크립트 포함은 서버 측 스크립트의 기록 데이터에 대한 CRUD 작업을 수행하기 위한 GlideRecord API의 대안입니다.") 및 [선택적](https://servicenow-prod.fluidtopics.net/hA4FcXX4LmxrkOZbtRKyhA#OptionalGlobalAPI "선택적 API는 존재하지 않는 경우에도 GlideQuery, Stream 또는 GlideRecord API에서 반환한 단일 기록과 상호 작용합니다. null 또는 정의되지 않은 쿼리 결과를 처리하여 오류가 발생할 가능성이 적은 스크립트를 작성합니다.") API와 함께 작동할 수 있습니다. 메서드 호출이 함께 체인을 호출하는 빌더 패턴으로, 각 메서드는 이전 메서드의 반환된 결과를 기반으로 합니다. 메서드를 사용하여 쿼리의 속성을 정의합니다. 메서드는 쿼리 결과를 반환하는 메서드인 터미널 메서드를 호출할 때까지 실행되지 않으므로 쿼리를 실행하기 전에 쿼리의 요구 사항을 정의할 수 있습니다.

쿼리가 단일 기록을 반환하는 경우 시스템은 결과를 선택적 객체로 래핑합니다. 쿼리가 레코드 스트림을 반환하는 경우 시스템은 결과를 Stream 개체로 래핑합니다. 이러한 개체를 사용하면 각 API의 메서드 집합을 사용하여 결과를 관리할 수 있습니다.

예를 들어, 이 스크립트는 작업 테이블에서 쿼리를 수행하고, 우선순위별로 기록을 그룹화하고, 총 재할당 수가 4 이상인 각 우선순위를 반환합니다.{#StreamGlobalAPI__code-ex-desc}  

    var query = new global.GlideQuery('task')
        .where('active', true) //Returns new GlideQuery object with a "where" clause.
        .groupBy('priority') //Returns new GlideQuery object with a "group by" clause.
        .aggregate('sum', 'reassignment_count') //Returns new GlideQuery object with a "sum(reassignment_count)" clause.
        .having('sum', 'reassignment_count', '>', 4) //Returns new GlideQuery object with a "having reassignment_count > 4" clause.
        .select() //Returns a stream of records wrapped in a Stream object.  
        .forEach(function (priority){ //Terminal method in the Stream class that executes the query and returns the result. 
          gs.info("Priority " + priority.group.priority + ": " + priority.sum.reassignment_count + " reassignments");
        });

출력:

    Priority 1: 11 reassignments
    Priority 3: 6 reassignments
    Priority 5: 5 reassignments

## 터미널 방법 {#StreamGlobalAPI__section_ldm_qjx_wmb}

성능상의 이유로 쿼리는 터미널 메서드를 호출할 때만 데이터를 가져옵니다. 다음은 Stream 클래스의 터미널 메서드입니다.

* [모든 ()](https://servicenow-prod.fluidtopics.net/C72jmZjJPzL62rBRQKNE1g#Stream-every_F "조건자 함수를 Stream 개체의 모든 항목에 적용합니다. 조건자가 스트림의 모든 항목에 대해 true를 반환하면 메서드는 true를 반환합니다. 조건자가 스트림의 모든 항목에 대해 false를 반환하면 메서드는 false를 반환합니다.")
* [찾기()](https://servicenow-prod.fluidtopics.net/C72jmZjJPzL62rBRQKNE1g#Stream-find_F "조건자 함수와 일치하는 Stream 개체의 첫 번째 레코드 또는 항목을 반환합니다. 조건자 함수가 제공되지 않은 경우 메서드는 Stream의 첫 번째 레코드 또는 항목을 반환합니다.")
* [forEach()를 호출합니다.](https://servicenow-prod.fluidtopics.net/C72jmZjJPzL62rBRQKNE1g#Stream-forEach_F "스트림의 각 기록 또는 항목에 지정된 함수를 적용합니다.")
* [줄이다()](https://servicenow-prod.fluidtopics.net/C72jmZjJPzL62rBRQKNE1g#Stream-reduce_F_A "스트림의 각 항목에 대해 감속기 기능을 실행하여 단일 출력 값을 생성합니다.")
* [일부()](https://servicenow-prod.fluidtopics.net/C72jmZjJPzL62rBRQKNE1g#Stream-some_F "조건자 함수(단일 값을 받아 true 또는 false를 반환하는 함수)를 스트림의 각 항목에 적용합니다. 조건자가 스트림의 모든 항목에 대해 true를 반환하면 메서드는 true를 반환합니다.")
* [toArray()를 호출합니다.](https://servicenow-prod.fluidtopics.net/C72jmZjJPzL62rBRQKNE1g#Stream-toArray_N "스트림에서 지정된 항목 수를 포함하는 배열을 반환합니다.")
{#StreamGlobalAPI__ul_u1m_2jd_smb}

## 스트림 - 스트림(함수 nextFn) {#ariaid-title2}

Stream 개체를 인스턴스화합니다.
이 생성자를 사용하는 대신 [GlideQuery](https://servicenow-prod.fluidtopics.net/tkBMAt54EDcNiTXYcFWJqQ#GlideQueryGlobalAPI "GlideQuery 스크립트 포함은 서버 측 스크립트의 기록 데이터에 대한 CRUD 작업을 수행하기 위한 GlideRecord API의 대안입니다.") API를 사용하여 쿼리를 기반으로 Stream 개체를 반환할 수 있습니다.
{#Stream-Stream_F__table_jx3_xbf_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 다음Fn | 기능 | 스트림에서 다음 항목을 검색하는 함수입니다. |
[표 1. 매개변수]

{#Stream-Stream_F__table_jx3_xbf_4mb}  
이 예제에서는 난수 생성기를 기반으로 Stream 개체를 만드는 방법을 보여 줍니다. 무한 루프가 생성되지 않도록 limit() 메서드를 포함해야 합니다.

    new Stream(Math.random)
       .map(Math.round)
       .map(function (num) { 
          return num === 1 ? 'heads' : 'tails'; 
       })
       .limit(10)
       .forEach(gs.info)

출력:

    *** Script: tails
    *** Script: heads
    *** Script: tails
    *** Script: heads
    *** Script: tails
    *** Script: heads
    *** Script: tails
    *** Script: tails
    *** Script: tails
    *** Script: tails

## 스트림 - chunk(Number count) {#ariaid-title3}

배열의 배치로 결과를 반환하며, 각 배열에는 메서드에 전달된 레코드 수가 포함되어 있습니다.
{#Stream-chunk_N__table_lkw_rcf_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 카운트 | 번호 | 스트림에서 반환된 각 배열의 기록 수입니다. |
[표 2. 매개변수]

{#Stream-chunk_N__table_lkw_rcf_4mb} {#Stream-chunk_N__table_mkw_rcf_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
[표 3. 반환]

{#Stream-chunk_N__table_mkw_rcf_4mb}  
이 예제에서는 테이블을 쿼리하고 결과를 배열 배치로 청크하는 방법을 보여 줍니다.

    var chunkResult = new GlideQuery('cmdb_ci_hardware')
        .select('asset', 'purchase_date')
        .limit(10)
        .chunk(5) //Returns arrays of 5 sys_ids at a time
        .forEach(function (chunk){ 
            gs.info(JSON.stringify(chunk, null, 2)); 
        });

출력:

    *** Script: [
      {
        "asset": "2fa9680d3790200044e0bfc8bcbe5dfb",
        "purchase_date": "2022-02-28",
        "sys_id": "2ba9680d3790200044e0bfc8bcbe5dfc"
      },
      {
        "asset": "73c1fa8837f3100044e0bfc8bcbe5ded",
        "purchase_date": "2017-12-05",
        "sys_id": "b4fd7c8437201000deeabfc8bcbe5dc1"
      },
      {
        "asset": "cbc1ba8837f3100044e0bfc8bcbe5dad",
        "purchase_date": "2017-12-05",
        "sys_id": "25fd3c8437201000deeabfc8bcbe5dea"
      },
      {
        "asset": "8fc1ba8837f3100044e0bfc8bcbe5da9",
        "purchase_date": null,
        "sys_id": "108a9205c611227500786e160f9d343e"
      },
      {
        "asset": "27c1fa8837f3100044e0bfc8bcbe5dd8",
        "purchase_date": "2017-06-06",
        "sys_id": "a9a2d111c611227601fb37542399caa8"
      }
    ]
    *** Script: [
      {
        "asset": "93c1fa8837f3100044e0bfc8bcbe5d30",
        "purchase_date": "2017-12-05",
        "sys_id": "6b43105c37301000deeabfc8bcbe5db2"
      },
      {
        "asset": "a2c0b1213784200044e0bfc8bcbe5de3",
        "purchase_date": "2017-12-05",
        "sys_id": "aac0b1213784200044e0bfc8bcbe5de3"
      },
      {
        "asset": "33c1fa8837f3100044e0bfc8bcbe5def",
        "purchase_date": "2017-12-05",
        "sys_id": "d0e8761137201000deeabfc8bcbe5da7"
      },
      {
        "asset": "53c1fa8837f3100044e0bfc8bcbe5d1f",
        "purchase_date": "2017-12-05",
        "sys_id": "53fdbc8437201000deeabfc8bcbe5d10"
      },
      {
        "asset": "f1c031213784200044e0bfc8bcbe5de0",
        "purchase_date": "2017-12-05",
        "sys_id": "71c031213784200044e0bfc8bcbe5de1"
      }
    ]

이 예제에서는 ID 배치를 사용하여 하위 쿼리를 만드는 방법을 보여 줍니다. chunk() 메서드를 사용한 후 flatMap() 메서드를 호출하면 시스템은 각 개별 레코드 대신 레코드 배치를 반복합니다.

    var chunkResult = new global.GlideQuery('cmdb_ci_hardware')
        .select('sys_id')
        .map(function (device) { return device.sys_id; })
        .chunk(5) //Returns arrays of 5 sys_ids at a time
        .flatMap(function (deviceIds) {
            return new GlideQuery('cmdb_sam_sw_install')
                .where('installed_on', 'IN', deviceIds)
                .select('software_model', 'installed_on');
        })

    gs.info(JSON.stringify(chunkResult));

## 스트림 - every(함수 조건자) {#ariaid-title4}

조건자 함수를 Stream 개체의 모든 항목에 적용합니다. 조건자가 스트림의 모든 항목에 대해 true를 반환하면 메서드는 true를 반환합니다. 조건자가 스트림의 모든 항목에 대해 false를 반환하면 메서드는 false를 반환합니다.
{#Stream-every_F__table_tyn_x2f_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 술어 | 기능 | 조건자 함수를 사용하여 Stream 개체 내의 모든 레코드 또는 항목에 적용할 수 있습니다. 함수는 스트림의 각 항목을 입력으로 사용하고 부울을 반환해야 합니다. |
[표 4. 매개변수]

{#Stream-every_F__table_tyn_x2f_4mb} {#Stream-every_F__table_uyn_x2f_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 부울 | 조건자 함수가 스트림의 모든 항목에 대해 true를 반환하는지 여부를 나타내는 플래그입니다. 유효한 값은 다음과 같습니다. * true: 조건자 함수는 스트림의 모든 항목에 대해 true를 반환합니다. * false: 조건자 함수는 스트림의 모든 항목에 대해 true를 반환하지 않습니다. {#Stream-every_F__ul_ij5_1kg_tmb} |
[표 5. 반환]

{#Stream-every_F__table_uyn_x2f_4mb}  
이 예제에서는 스트림의 모든 항목에 조건자 함수를 적용하는 방법을 보여 줍니다.

    var hasOnlyShortDescriptions = new global.GlideQuery('task')
       .whereNotNull('description')
       .select('description')
       .every(function (t) { 
           return t.description.length < 10; 
           });

    gs.info(hasOnlyShortDescriptions);

출력:

    false

## Stream - filter(함수 조건자) {#ariaid-title5}

조건자 함수를 Stream 개체의 각 항목에 적용합니다. 조건자가 true를 반환하면 메서드는 스트림을 반환합니다. 조건자가 false를 반환하면 빈 Stream 개체를 반환합니다.
성능을 향상시키려면 가능한 경우 이 메서드 대신 GlideQuery 클래스에서 where(),whereNotNull() 및 whereNull() 메서드를 사용합니다. [GlideQuery](https://servicenow-prod.fluidtopics.net/tkBMAt54EDcNiTXYcFWJqQ#GlideQueryGlobalAPI "GlideQuery 스크립트 포함은 서버 측 스크립트의 기록 데이터에 대한 CRUD 작업을 수행하기 위한 GlideRecord API의 대안입니다.")를 참조하십시오.
{#Stream-filter_F__table_qyn_g1l_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 술어 | 기능 | 조건자 함수를 사용하여 Stream 개체 내의 모든 레코드 또는 항목에 적용할 수 있습니다. 함수는 스트림의 각 항목을 입력으로 사용하고 부울을 반환해야 합니다. |
[표 6. 매개변수]

{#Stream-filter_F__table_qyn_g1l_4mb} {#Stream-filter_F__table_fcd_j2f_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
[표 7. 반환]

{#Stream-filter_F__table_fcd_j2f_4mb}  
이 예제에서는 정의된 필터에 대해 작업 테이블의 모든 기록을 확인하는 방법을 보여줍니다. 기록이 필터와 일치하면 시스템이 기록 스트림을 반환합니다. 그렇지 않으면 빈 Stream 개체를 반환합니다.

    var shoutingTasks = new global.GlideQuery('task')
       .whereNotNull('description')
       .select('description')
       .filter(function (task) { 
           return task.description.toUpperCase() === task.description; 
       })

## 스트림 - find(함수 조건자) {#ariaid-title6}

조건자 함수와 일치하는 Stream 개체의 첫 번째 레코드 또는 항목을 반환합니다. 조건자 함수가 제공되지 않은 경우 메서드는 Stream의 첫 번째 레코드 또는 항목을 반환합니다.
{#Stream-find_F__table_gn4_k2f_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 술어 | 기능 | 옵션입니다. 조건자 함수를 사용하여 Stream 개체 내의 항목에 적용할 수 있습니다. 함수는 스트림의 각 항목을 입력으로 사용하고 부울을 반환해야 합니다. |
[표 8. 매개변수]

{#Stream-find_F__table_gn4_k2f_4mb} {#Stream-find_F__table_hn4_k2f_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 옵션 | 반환된 기록을 포함하는 객체입니다. |
[표 9. 반환]

{#Stream-find_F__table_hn4_k2f_4mb}  
이 예제에서는 스트림에서 첫 번째 레코드를 반환하는 방법을 보여 줍니다.

    var UserOptional = new global.GlideQuery('sys_user')
       .where('active', true)
       .where('company.name', 'ServiceNow')
       .select()
       .find()
       .map(function (user) { 
          return JSON.stringify(user); 
       })

    gs.info(UserOptional);

출력:

    Optional<{"sys_id":"babb4639b76233004fbc2089ee11a97f"}>

## 스트림 - flatMap(함수 fn) {#ariaid-title7}

스트림의 모든 항목에 함수를 적용합니다. 반복할 수 있는 다른 스트림을 반환합니다.
함수가 두 번째 레코드 스트림을 반환하는 경우 map() 대신 이 메서드를 사용합니다.
{#Stream-flatMap_F__table_nrd_tgf_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 에프엔(fn) | 기능 | Stream 개체를 반환하는 쿼리의 결과에 적용할 함수입니다. |
[표 10. 매개변수]

{#Stream-flatMap_F__table_nrd_tgf_4mb} {#Stream-flatMap_F__table_jjk_h2f_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 스트림 | 기능을 적용한 후 업데이트된 기록 스트림을 포함하는 객체입니다. |
[표 11. 반환]

{#Stream-flatMap_F__table_jjk_h2f_4mb}  
이 예에서는 사용자 테이블을 쿼리한 다음 결과에서 자식 쿼리를 만드는 방법을 보여 줍니다. 이 예제에서는 성능 문제를 일으킬 수 있는 N+1 쿼리를 실행합니다. 프로덕션 환경에서는 이 사용 사례를 피하십시오.

    var records = new global.GlideQuery('sys_user')
       .where('last_login', '>', '2015-12-31')
       .select('first_name', 'last_name')
       .flatMap(function (u) {
          return new global.GlideQuery('task')
               .where('closed_by', u.sys_id)
               .select('closed_at', 'description')
               .map(function (t) {
                    return {
                        first_name: u.first_name,
                        last_name: u.last_name,
                        description: t.description,
                        closed_at: t.closed_at
                     };
               });
          })
       .limit(5)
       .toArray(100);

    gs.info(JSON.stringify(records));

출력:

    [
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:14:56"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:07:43"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-06-15 06:59:05"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:07:33"
       },
       {
          "first_name":"System",
          "last_name":"Administrator",
          "description":null,
          "closed_at":"2020-08-23 13:07:14"
       }
    ]

## 스트림 - forEach(함수 fn) {#ariaid-title8}

스트림의 각 기록 또는 항목에 지정된 함수를 적용합니다.
{#Stream-forEach_F__table_nrd_tgf_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 에프엔(fn) | 기능 | 스트림의 각 항목에 적용할 함수입니다. |
[표 12. 매개변수]

{#Stream-forEach_F__table_nrd_tgf_4mb} {#Stream-forEach_F__table_emq_dff_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 없음 |   |
[표 13. 반환]

{#Stream-forEach_F__table_emq_dff_4mb}  
이 예제에서는 스트림에 있는 각 항목의 결과를 인쇄하는 방법을 보여 줍니다.

    var firstNames = new global.GlideQuery('sys_user')
       .select('first_name')
       .forEach(function (u) { 
          gs.debug(u.first_name); 
       });

출력:

    *** Script: [DEBUG] survey
    *** Script: [DEBUG] Lucius
    *** Script: [DEBUG] Jimmie
    *** Script: [DEBUG] Melinda
    *** Script: [DEBUG] Jewel
    *** Script: [DEBUG] Sean
    *** Script: [DEBUG] Jacinto
    *** Script: [DEBUG] Krystle
    *** Script: [DEBUG] Billie
    *** Script: [DEBUG] Christian
    *** Script: [DEBUG] Naomi
    ...

## 스트림 - fromArray(객체 arr) {#ariaid-title9}

제공된 배열의 값을 포함하는 Stream 개체를 반환합니다.
주:  
이 메서드는 정적입니다. 이 메서드를 사용하기 위해 클래스의 인스턴스가 필요하지는 않습니다.
{#Stream-fromArray_O__table_qdh_jff_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 도착 | 배열 | 스트림을 만들 값의 배열입니다. |
[표 14. 매개변수]

{#Stream-fromArray_O__table_qdh_jff_4mb} {#Stream-fromArray_O__table_rdh_jff_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
[표 15. 반환]

{#Stream-fromArray_O__table_rdh_jff_4mb}  
이 예제에서는 값 배열을 포함하는 Stream 개체를 만드는 방법을 보여 줍니다.

    var nameStream = Stream.fromArray(['Bob', 'Sue', 'Sam'])
       .map(function (name) { 
          return name.toUpperCase(); 
       })
       .toArray(3);

    gs.info(JSON.stringify(nameStream));

출력:

    ["BOB","SUE","SAM"]

## 스트림 - limit(숫자 수) {#ariaid-title10}

스트림에서 반환되는 결과 수를 제한합니다.
성능을 향상시키려면 가능한 경우 GlideQuery 클래스의 limit() 메서드를 사용합니다. [GlideQuery](https://servicenow-prod.fluidtopics.net/tkBMAt54EDcNiTXYcFWJqQ#GlideQueryGlobalAPI "GlideQuery 스크립트 포함은 서버 측 스크립트의 기록 데이터에 대한 CRUD 작업을 수행하기 위한 GlideRecord API의 대안입니다.")를 참조하십시오. 이 메서드를 사용하여 Stream.flatMap() 메서드로 결과를 제한해야 할 수도 있습니다.
{#Stream-limit_N__table_gvh_2mc_nmb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 카운트 | 번호 | 반환할 기록 수입니다. |
[표 16. 매개변수]

{#Stream-limit_N__table_gvh_2mc_nmb} {#Stream-limit_N__table_xhc_zbf_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 스트림 | 기록과 같은 항목 스트림과 상호작용하는 데 사용되는 객체입니다. |
[표 17. 반환]

{#Stream-limit_N__table_xhc_zbf_4mb}  
이 예제에서는 Stream.flatMap() 메서드에서 반환되는 결과를 제한하는 방법을 보여 줍니다.

    var records = new global.GlideQuery('sys_user')
       .where('last_login', '>', '2015-12-31')
       .select('first_name', 'last_name')
       .flatMap(function (u) {
          return new GlideQuery('task')
               .where('closed_by', u.sys_id)
               .select('closed_at', 'description')
               .map(function (t) {
                    return {
                        first_name: u.first_name,
                        last_name: u.last_name,
                        description: t.description,
                        closed_at: t.closed_at
                     };
               });
          })
       .limit(5)
       .forEach(function (task){
          gs.info(JSON.stringify(task, null, 2));
       });

출력:

    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:16"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:22"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:27"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:31"
    }
    *** Script: {
      "first_name": "System",
      "last_name": "Administrator",
      "description": null,
      "closed_at": "2021-10-04 13:40:54"
    }

## 스트림 - map(함수 fn) {#ariaid-title11}

스트림의 각 항목에 함수를 적용하고 업데이트된 Stream 개체를 반환합니다.
{#Stream-map_F__table_zkh_rgf_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 에프엔(fn) | 기능 | 스트림의 각 항목을 입력으로 사용하는 쿼리 결과에 적용할 함수입니다. |
[표 18. 매개변수]

{#Stream-map_F__table_zkh_rgf_4mb} {#Stream-map_F__table_pct_xdf_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 스트림 | 기능을 적용한 후 업데이트된 기록 스트림을 포함하는 객체입니다. |
[표 19. 반환]

{#Stream-map_F__table_pct_xdf_4mb}  
이 예제에서는 스트림의 모든 항목에 함수를 적용하는 방법을 보여 줍니다.

    var users = new global.GlideQuery('sys_user')
       .whereNotNull('first_name')
       .select('first_name')
       .map(function (u) { 
          return u.first_name.toUpperCase(); 
       })
       .toArray(100);

    gs.info(JSON.stringify(users));

출력:

    [
       "SURVEY",
       "LUCIUS",
       "JIMMIE",
       "MELINDA",
       "JEWEL",
       "SEAN",
       "JACINTO",
       "KRYSTLE",
       "BILLIE",
       "CHRISTIAN",
       ...
    ]

## 스트림 - reduce(함수 reducerFn, 모든 initialValue) {#ariaid-title12}

스트림의 각 항목에 대해 감속기 기능을 실행하여 단일 출력 값을 생성합니다.
이 메서드는 네이티브 JavaScript reduce() 메서드와 유사합니다. 자세한 내용은 [w3schools 설명서를](https://www.w3schools.com/jsref/jsref_reduce.asp) 참조하세요.
{#Stream-reduce_F_A__table_ogx_bff_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 감속기Fn | 기능 | 스트림을 단일 값으로 줄이는 스트림의 각 항목에 적용할 함수입니다. 이 함수는 두 개의 인수를 사용해야 합니다. * `acc`: 함수에서 반환된 모든 값을 누적하는 누산기입니다. * `cur`: 배열에 누적되고 있는 현재 항목입니다. {#Stream-reduce_F_A__ul_k1m_yd3_5mb} |
| initialValue | 모든 | 함수에 초기 값으로 전달되는 값입니다. |
[표 20. 매개변수]

{#Stream-reduce_F_A__table_ogx_bff_4mb} {#Stream-reduce_F_A__table_pgx_bff_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 모든 | 감속기 함수에서 반환하는 모든 항목의 누적 합계입니다. |
[표 21. 반환]

{#Stream-reduce_F_A__table_pgx_bff_4mb}  
이 예에서는 사용자 테이블에서 이름이 가장 긴 레코드를 반환하는 방법을 보여줍니다.

    var longestName = new global.GlideQuery('sys_user')
       .whereNotNull('first_name')
       .select('first_name')
       .reduce(function (acc, cur) {
           return cur.first_name.length > acc.length
               ? cur.first_name
               : acc;
           }, '');

    gs.info(JSON.stringify(longestName));

출력:

    "ATF_TestItilUser1"

## 스트림 - some(함수 조건자) {#ariaid-title13}

조건자 함수(단일 값을 받아 true 또는 false를 반환하는 함수)를 스트림의 각 항목에 적용합니다. 조건자가 스트림의 모든 항목에 대해 true를 반환하면 메서드는 true를 반환합니다.
{#Stream-some_F__table_q4v_v2f_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 술어 | 기능 | 조건자 함수를 사용하여 Stream 개체 내의 항목에 적용할 수 있습니다. 부울 값을 반환해야 합니다. |
[표 22. 매개변수]

{#Stream-some_F__table_q4v_v2f_4mb} {#Stream-some_F__table_r4v_v2f_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 부울 | 조건자 함수가 스트림의 항목에 대해 true를 반환했는지 여부를 나타내는 플래그입니다. 유효한 값은 다음과 같습니다. * true: 조건자 함수가 스트림의 항목에 대해 true를 반환했습니다. * false: 조건자 함수가 스트림의 항목에 대해 true를 반환하지 않았습니다. {#Stream-some_F__ul_iwm_q33_5mb} |
[표 23. 반환]

{#Stream-some_F__table_r4v_v2f_4mb}  
이 예제에서는 작업 테이블의 설명이 1,000자를 초과하는지 여부를 확인하는 방법을 보여 줍니다.

    var hasLongDescriptions = new global.GlideQuery('task')
       .whereNotNull('description')
       .select('description')
       .some(function (t) { 
          return t.description.length > 1000; 
       });


    gs.info(hasLongDescriptions);

출력:

    false

## 스트림 - toArray(Number count) {#ariaid-title14}

스트림에서 지정된 항목 수를 포함하는 배열을 반환합니다.
{#Stream-toArray_N__table_acv_y2f_4mb__entry__3}

| 이름 | 유형 | 설명 |
|-|-|-|
| 카운트 | 번호 | 배열에서 반환할 스트림의 최대 항목 수입니다. |
[표 24. 매개변수]

{#Stream-toArray_N__table_acv_y2f_4mb} {#Stream-toArray_N__table_bcv_y2f_4mb__entry__2}

| 유형 | 설명 |
|-|-|
| 배열 | 스트림에서 지정된 항목 수를 포함하는 배열입니다. |
[표 25. 반환]

{#Stream-toArray_N__table_bcv_y2f_4mb}  
이 예제에서는 레코드 스트림을 JavaScript 배열로 변환하는 방법을 보여 줍니다.

    var users = new global.GlideQuery('sys_user')
        .limit(10)
        .select('first_name', 'last_name')
        .toArray(50);

    gs.info(JSON.stringify(users));

출력:

    [
       {
          "first_name":"Jewel",
          "last_name":"Agresta",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d64"
       },
       {
          "first_name":"Sean",
          "last_name":"Bonnet",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d6d"
       },
       {
          "first_name":"Jacinto",
          "last_name":"Gawron",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d76"
       },
       {
          "first_name":"Krystle",
          "last_name":"Stika",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d7f"
       },
       {
          "first_name":"Billie",
          "last_name":"Cowley",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d88"
       },
       {
          "first_name":"Christian",
          "last_name":"Marnell",
          "sys_id":"02826bf03710200044e0bfc8bcbe5d91"
       }
    ]


