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

파이썬 웹크롤링 패키지로 크게 BeautifulSoup과 selenium이 있습니다.

 

BeautifulSoup으로는 동적페이지를 파싱해오기 어렵기때문에

동적페이지에서는 selenium을 사용하고 정적페이지에서는 BeautifulSoup을 써도 무방합니다.

 

먼저 BeautifulSoup에 대해서 위키백과 설명을 보면

HTML과 XML 문서들의 구문을 분석하기 위한 파이썬 패키지이다

HTML로부터 데이터를 추출하기 위해 사용할 수 있는 파싱된 페이지의 파스 트리를 만드는데, 이는 웹 스크래핑에 유용하다

이렇게 나와있습니다.

 

BeautifulSoup을 사용하면 계층구조로 된 html태그를 바탕으로 쉽게 파싱을 해올 수 있는데

먼저 파싱해올 url을 아래와 같이 입력하여 가져옵니다.

 

from bs4 import BeautifulSoup
from urllib.request import urlopen

if __name__ == "__main__":
    url = 'https://naver.com'
    html = urlopen(url)
    bsObject = BeautifulSoup(html, "html.parser")

그 후 가져오고 싶은 영역이 있으면 .find()를이용해서 가져온 bsObject 안에서 해당 태그를 가져옵니다

print(bsObject.find('div', 'list_theme_wrap'))

만약에 li와 같은 리스트를 가져오고 싶으면 find_all()을 사용해서 list형식으로 가져올 수도 있습니다.

print(bsObject.find_all('li', 'theme_item'))

또 그안에 있는 text를 가져오려면 .text를 용한뒤 .strip()을 통해 좌우 공백을 지워줄 수 있습니다.

li_list = bsObject.find_all('li', 'theme_item')

    for li in li_list:
        print(li.text.strip())

 

728x90

소프트웨어 버전관리를 하게되면 현재버전이 최신버전인지 아닌지 비교해야할 경우가 생깁니다

 

현재버전이 1.0.0이고 최신버전이 1.0.1이라고 하면 

버전을 비교해서 현재버전이 최신버전보다 낮으면 업그레이드를 하라고 알림 줘야하기 떄문입니다 

 

그럴때 유용하게 쓸 수 있는 패키지가 semver패키지입니다

 

저도 앱 강제업데이트를 위해서 버전비교하는 로직을 만들다가 

버전에서 .로 나눈다음에 숫자로 바꿔서 크기비교를 해야하나 라는 고민을 하다가

semver 패키지를 알게되었고 아주 간단하게 버전비교를 할 수 있었습니다

 

 

먼저 pip install semver로 패키지 설치를 진행한 뒤 아래 코드처럼 import 해서 사용하시면 됩니다

import semver

def app_update_check(db, data):
    version = convert_data_app_version(AppDao.app_update_check(db))

    # 최소 버전보다 낮으면 강제 업데이트, 최소 버전보다 높은데 최신 버전보다 낮으면 선택 업데이트
    # result (-1: 왼쪽이 낮음, 1: 왼쪽이 높음, 0: 같음)
    # 강제업데이트
    isForceUpdate = semver.compare(data['version'], version['min_version'])

    # 선택 업데이트
    isUpdate = semver.compare(data['version'], version['newest_version'])

    return {"isForceUpdate": isForceUpdate, 'isUpdate': isUpdate}

소스를 보시면 클라이언트에게 현재버전을 받고, db에서 최소버전 최신버전을 가져와서 비교를 한뒤
강제업데이트를 할것인지 선택업데이트를 할것인지 응답을 주는 코드인데 semver.compare()를 사용하면
바로 결과값이 나오는걸 확인할 수 있습니다

+ Recent posts