728x90

앞서 이야기한 것처럼 자바 스트림(Stream)은 컬렉션 데이터를 함수형 프로그래밍 방식으로 처리할 수 있는 장점을 가지고 있습니다. 이번에는 스트림의 특징과 종류, 그리고 사용 방법 등에 대해 좀 더 자세히 살펴보겠습니다.

 

스트림의 특징

스트림은 크게 다음과 같은 특징을 가집니다.

  • 순차 처리(Stream)와 병렬 처리(Parallel Stream)를 모두 지원합니다.
  • 스트림은 데이터를 저장하지 않으며, 데이터를 처리하는 방식만을 정의합니다.
  • 스트림은 데이터 소스로부터 데이터를 읽기 때문에 한 번만 사용 가능합니다.
  • 중간 연산(intermediate operation)과 최종 연산(terminal operation)으로 구성됩니다.
  • 중간 연산은 스트림을 반환합니다. 즉, 중간 연산을 여러 개 연결하여 사용할 수 있습니다.
  • 최종 연산은 스트림을 종료하며, 스트림을 이용해 원하는 작업을 수행합니다.

스트림의 종류

스트림은 크게 세 가지 종류로 나눌 수 있습니다.

  • 기본형 스트림: int, long, double 등 기본형 데이터를 다루는 스트림입니다.
  • 객체 스트림: 객체를 다루는 스트림입니다.
  • 병렬 스트림: 여러 스레드를 이용해 병렬 처리를 할 수 있는 스트림입니다.

각 종류별로 제공되는 스트림의 메서드와 기능이 다르므로, 필요에 따라 적절한 스트림을 선택하여 사용해야 합니다.

스트림의 사용 방법

스트림은 컬렉션 데이터를 처리할 때 가장 많이 사용됩니다. 스트림은 다음과 같은 순서로 사용합니다.

  1. 컬렉션 데이터를 스트림으로 변환합니다.
  2. 중간 연산을 이용해 데이터를 처리합니다.
  3. 최종 연산을 이용해 최종 결과를 반환합니다.

스트림의 사용 예시를 보면 다음과 같습니다.

 

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

int sum = list.stream()
              .filter(i -> i > 2)
              .mapToInt(i -> i * 2)
              .sum();
System.out.println(sum);

코드는 List 요소 중에서 2보다 요소를 2배로 만들어 합산한 값을 출력하는 예제입니다.

'자바 JAVA' 카테고리의 다른 글

1. 자바 JAVA - 스트림(stream)  (0) 2023.01.17
자바 JAVA - 람다 표현식  (0) 2023.01.14
자바 csv 파일쓰기 (한글깨짐 처리)  (1) 2021.09.14
728x90

스트림이란?

자바의 스트림 또한 자바8부터 지원하는 문법으로 컬렉션 데이터를 for문 없이 함수형 프로그래밍을 할 수 있으며

병렬처리가 가능하단 장점이 있습니다.

 

사용법으로는 

arrayList.stream().filter().map().sorted() 이런식으로 사용할 수 있습니다.

 

위에서 보면 filter, map, sorted등 stream api에서 제공하는 여러 함수들이 있는데 함수들의 기능들을 알면 

필터링, 맵핑, 소팅, 출력등을 쉽게 제어할 수 있습니다.

아래 링크에 들어가면 함수별 기능이 있고, 필요에따라 사용하실 수 있습니다.

 

https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html 

 

Stream (Java Platform SE 8 )

A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and IntStream: int sum = widgets.stream() .filter(w -> w.getColor() == RED) .mapToInt(w -> w.getWeight())

docs.oracle.com

 

간단한 예제를 하나 보고 넘어가면 아래와 같이 String으로 구성된 ArrayList를 순서대로 출력을 할 수도 있고,

sorted()함수를 이용해 정렬 후 출력을 할 수 있습니다.

public class ArrayListStreamTest {
    public static void main(String[] args) {
        List<String> sList = new ArrayList<String>();
        sList.add("ddd");
        sList.add("bbb");
        sList.add("ccc");

        Stream<String> stream = sList.stream();
        stream.forEach(s-> System.out.println(s + " "));
        System.out.println();

        sList.stream().sorted().forEach(s-> System.out.println(s));
    }
}

또한 아래 예제처럼 int로 구성된 리스트중에서 filter()함수를 사용하여 리스트의 숫자중 3보다 큰수의 합만 구할 수도 있습니다.

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

        int result = Arrays.stream(arr).filter(c -> c > 3).sum();
        System.out.println(result);
    }
}

 

'자바 JAVA' 카테고리의 다른 글

2. 자바 JAVA - 스트림(stream)  (0) 2023.04.05
자바 JAVA - 람다 표현식  (0) 2023.01.14
자바 csv 파일쓰기 (한글깨짐 처리)  (1) 2021.09.14
728x90

람다란?

자바 8에서 새로 추가된 기능 중 하나인 람다(lambda)는 함수형 프로그래밍을 지원하며 코드의 간결성과 가독성을 높여주는 기능입니다. 이번 블로그에서는 자바 람다에 대해 간략하게 소개하고자 합니다.

  1. 람다 표현식 람다 표현식은 익명 함수를 만들기 위한 식으로, 메서드를 간단하게 표현할 수 있습니다. 람다 표현식은 세 가지 부분으로 이루어져 있습니다. 첫 번째는 매개변수 목록, 두 번째는 화살표(->), 그리고 세 번째는 메서드 바디입니다.

예를 들어, 다음과 같은 코드는 람다 표현식으로 간단하게 표현할 수 있습니다.

 

public class Example {
  public static void main(String[] args) {
    Runnable runnable = new Runnable() {
      public void run() {
        System.out.println("Hello, World!");
      }
    };
    runnable.run();
  }
}

 

위 코드를 람다 표현식으로 변경하면 다음과 같습니다.

public class Example {
  public static void main(String[] args) {
    Runnable runnable = () -> System.out.println("Hello, World!");
    runnable.run();
  }
}

2. 함수형 인터페이스 람다 표현식은 함수형 인터페이스(functional interface)를 구현할 때 사용됩니다. 함수형 인터페이스는 딱 하나의 추상 메서드만을 가지는 인터페이스로, 람다 표현식은 이 추상 메서드의 구현체를 만들어 줍니다.

예를 들어, 다음과 같은 코드는 Runnable 인터페이스를 구현한 클래스입니다.

 

public class Example {
  public static void main(String[] args) {
    Runnable runnable = new Runnable() {
      public void run() {
        System.out.println("Hello, World!");
      }
    };
    runnable.run();
  }
}

위 코드를 람다 표현식으로 변경하면 다음과 같습니다.

public class Example {
  public static void main(String[] args) {
    Runnable runnable = () -> System.out.println("Hello, World!");
    runnable.run();
  }
}

 

3. 메서드 레퍼런스 메서드 레퍼런스(method reference)는 람다 표현식을 더욱 간결하게 만들어주는 기능입니다. 메서드 레퍼런스는 :: 기호를 사용하여 표현하며, 메서드의 이름과 파라미터를 사용합니다.

 

4. 람다 표현식의 장점 자바 8에서 람다 표현식이 도입되면서 코드의 간결성과 가독성이 높아졌습니다. 람다 표현식을 사용하면 복잡한 코드를 간단하게 작성할 수 있으며, 코드의 중복을 줄이고 가독성을 높일 수 있습니다.

또한 람다 표현식은 함수형 프로그래밍을 지원하기 때문에 스트림(stream) API와 같은 다른 기능들과 함께 사용할 때 매우 유용합니다.

 

5. 람다 표현식의 단점 람다 표현식은 자바 8에서 도입된 기능으로, 이전 버전의 자바에서는 사용할 수 없습니다. 따라서 이전 버전과 호환성을 유지해야 하는 경우에는 람다 표현식 대신 익명 클래스를 사용해야 합니다.

 

또한 람다 표현식이 복잡한 로직을 다루는 경우에는 가독성이 떨어질 수 있습니다. 이러한 경우에는 람다 표현식보다는 일반적인 메서드를 사용하는 것이 더욱 적합할 수 있습니다.

 

스트림 API와 같은 다른 기능들과 함께 사용할 때 매우 유용합니다.

하지만 람다 표현식이 복잡한 로직을 다루는 경우에는 가독성이 떨어질 수 있으므로, 적절한 상황에서 사용해야 합니다.

또한 람다 표현식이 도입되면서 함수형 프로그래밍의 개념이 자바에 접목되었는데, 함수형 프로그래밍은 상태를 변경하지 않고 입력값만을 가지고 출력값을 생성하는 방식으로 코드를 작성하는 것을 말합니다. 이러한 방식으로 코드를 작성하면 예측 가능한 동작을 보장할 수 있으며, 코드의 안정성과 유지보수성을 높일 수 있습니다.

따라서 람다 표현식을 사용하면 자바 코드를 더욱 간결하고 유연하게 작성할 수 있으며, 함수형 프로그래밍의 장점을 누릴 수 있습니다. 하지만 적절한 상황에서 사용하고, 복잡한 로직은 일반적인 메서드를 사용하는 것이 더욱 바람직합니다.

'자바 JAVA' 카테고리의 다른 글

2. 자바 JAVA - 스트림(stream)  (0) 2023.04.05
1. 자바 JAVA - 스트림(stream)  (0) 2023.01.17
자바 csv 파일쓰기 (한글깨짐 처리)  (1) 2021.09.14
728x90

 

 

위키백과에 나온 csv정의는 아래와 같습니다.

CSV(영어: comma-separated values)는 몇 가지 필드를 쉼표(,)로 구분한 텍스트 데이터 및 텍스트 파일이다. 확장자는 . csv이며 MIME 형식은 text/csv이다

 

데이터가 ,(콤마)로 구분되어있는 텍스트형식의 데이터인데 excel로 열면 표로 표현이되고 xlsx파일로 변환해서 저장도 가능하기 때문에 자주 사용하는 방식중 하나입니다.

 

자바 스프링에서 엑셀파일을 생성할려면 poi등 라이브러리를 사용해야하지만

Csv경우 Stringbuffer와 outputstream만 있으면 되기때문에 쉽게 생성할 수 있습니다.

또한 데이터 분석시 csv파일을 많이 사용하기 떄문에 데이터를 제공할떄도 좋다고 생각합니다.

 

우선 csv로 뽑을 데이터를 list형식으로 뽑아온 뒤 StringBuffer 객체를 생성해주고 각 컬럼이 어떤데이터인지 알아야하기 떄문에

맨윗줄에 컬럼명을 적어줍니다

List<ReportVo> reportList = reportMapper.getReportListExcel(vo);
			
			StringBuffer sb = new StringBuffer(); 
			sb.append("사용자ID,사용자발화,의도명,만족도,등록일,채널");

그 후 list를 포문으로 돌려서 index데이터를 row로 저장시킵니다.

위에서 말했듯 csv는 텍스트형 데이터라고 했기 떄문에 각row는 “\n”을 사용해서 구분을 해줍니다.

 

for(int reportListCnt = 0; reportListCnt < reportList.size(); reportListCnt++) {
	String row = reportList.get(reportListCnt).getUser_id() + ',' 
    	//내용에 ,또는 \n이있으면 행렬이 꺠지기떄문에 replace처리를 해준다
        + reportList.get(reportListCnt).getUtterance().replace(',', ' ').replace('\n',  ' ') + ','
		+ reportList.get(reportListCnt).getIntent_title().replace(',', ' ') + ',' 
        + reportList.get(reportListCnt).getSatisfaction() + ','
		+ reportList.get(reportListCnt).getCreate_date() + ',' 
        + reportList.get(reportListCnt).getChannel();

	sb.append("\n");
	sb.append(row);
}

 

저는 리스트로 뽑아온 데이터를 row에 넣어준것이고 자신의 방법에 맞게 각각의 데이터를 ,로 구분해서 row를 만들어주시면 됩니다.

String row = “가.나,다,라,마,바”;

이런 형식을 만들어주시면 됩니다.

 

저는 서버 특정경로에 바로 떨굴게 아니고 브라우저를 통해서 다운로드가 되도록 할것이기 떄문에 

 

이렇게 response를 set해주고 filename에 다운받아지는 파일명을 적어줍니다.

그리고 outputStream을 통해 다운을 받으면 여전이 한글이 꺠져서 나오기 떄문에 아래와같이 

outputStream.write(sb.toString().getBytes("MS949"));

형식으로 넣어줍니다.

 

response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment; filename=\"chatLog.csv\"");
response.setHeader("Content-Type","text/csv; charset=MS949" );

OutputStream outputStream = response.getOutputStream();
outputStream.write(sb.toString().getBytes("MS949"));
outputStream.flush();
outputStream.close();
sb.setLength(0);

 

마지막으로 메모리 확보를 위해 outputStream.flush(), outputStream.close()를 해주고

StringBuffer 초기화를 해줍니다 .

 

'자바 JAVA' 카테고리의 다른 글

2. 자바 JAVA - 스트림(stream)  (0) 2023.04.05
1. 자바 JAVA - 스트림(stream)  (0) 2023.01.17
자바 JAVA - 람다 표현식  (0) 2023.01.14

+ Recent posts