반응형

https://school.programmers.co.kr/learn/courses/30/lessons/181914

해당 문제를 람다식 형식과 스트림 방식을 통해 구현해보았다.

이번에 자바의정석을 통해 람다와 스트림을 처음 배워봤는데, 한번에 이해될거라 생각하지 못했지만, 완벽히 이해하지 못해서 공부해보고자 프로그래머스에서 가장 쉬운 난이도인 lv0문제를 대상으로 풀어봤다.

람다식으로 풀었을 때

public int solution(String number) {
        Function<String, Integer> counter = string -> {

        int count = 0;
        for (int i = 0; i < number.length(); i++) {
            count += number.charAt(i) - '0';
        }

        return count % 9;
    };

        return counter.apply(number);
    }

 

스트림으로 풀 때의 다양한 형식

public int solution2(String number) {
        //mapToInt는 10만의 제한때문에 할 수 없음
        return IntStream.range(0, number.toCharArray().length)
                .mapToObj(i -> Character.getNumericValue(number.charAt(i)))
                .reduce(0, Integer::sum) % 9;

        number.chars()
                .map(Character::getNumericValue)
                .reduce(0, Integer::sum);
        return sum % 9;

        return number.chars()
                .map(ch -> Character.getNumericValue(ch))
                .reduce(0, (x, y) -> x + y) % 9;

        return number.chars()
                .map(Character::getNumericValue)
                .reduce(0,(x, y) -> x + y) % 9;

    }

해당 문제는 number라는 String형태로 길이가 10만까지 주어지기에 int형이나 long형태를 사용하지 못하기때문에, mapToInt, mapToLong을 사용하지 못했다

그래서 char배열을 활용해야한다고 생각까지만 하고 해결하지 못하고 gpt한테 물어봐서 해결했다

알고 보니 String에는 chars라는 스트림을 지원해서 해당 스트림을 활용하면 풀 수 있는 문제였다

한동안은 계속 헤맬듯…

반응형
반응형

공부하며 가볍게 정리

람다


람다식은 함수(메서드)를 간단한 식으로 표현하는 것

람다 작성 방법 : 메서드의 이름과 반환타입을 제거하고 →를 블록{} 앞에 추가한다

ex)

int max(int a, int b){
	return a > b ? a : b;
}
(int a, int b) -> {
	return a > b ? a : b;
}

람다식을 활용하여 사용할 때는 함수형 인터페이스를 통해서 람다를 구현할 수 있어야한다.

interface를 자체적으로 선언해서 활용해도 되고, 기존에 있는 Functions 패키지에 들어있는 여러 클래스의 의미를 명확히 아는 것이 좋을 것 같다. 그 이유는 자바에서 지원하는 내부 클래스에는 함수형 인터페이스를 매개로 동작하는 메서드들이 있는데 그 메서드를 사용하기 위해서는 함수형 인터페이스가 어떻게 활용되는지 의미라도 파악을 해야 사용할 수 있을 것이기 때문이다.

함수형 인터페이스로는 대표적으로 네가지가 있고 바로 아래 쓴 메서드가 해당 함수를 실행하는 메서드이다.

  • Supplier<T> - 공급자 : 매개변수는 없고 반환값만 있다
    • get()
  • Consumer<T> - 사용자 : 매개변수는 있고, 반환값이 없다
    • accept()
  • Function<T, R> - 함수 : 일반적인 함수형태, 하나의 매개변수를 받아 결과를 반환
    • apply()
  • Predicate<T> - 매개변수 하나를 받아서 boolean타입으로 반환한다
    • test()

T는 제네릭타입을 뜻하고, R은 리턴타입을 뜻한다.

추가로 Bi가 붙은 형태가 있는데 다른 방법은 똑같고 매개변수가 두개 들어간다는 의미이다.

 

스트림


스트림은 jdk1.8버전부터 도입이 되었는데, 도입 이유는 Collection 인터페이스의 자식인 List, Set, Map과 배열등은 이전 버전까지는 같은 메서드여도 동작하는 형태가 달랐다. 때문에 이를 통일된 방식으로 처리를 하기 위해 표준화해서 등장한 것이다.

ex) 배열, List, Set, Map의 정렬방식이 서로 다름

장점으로는 데이터 소스를 추상화하여 표준화 된 방식으로 사용이 가능하고, 또 원본의 코드를 수정하지 않기 때문에 코드의 재사용성이 높아진다. 또한 간결하게 표현이 가능해 가독성이 높아진다.

단점으로는 단순한 로직에서 데이터의 양이 적다면 순환하는데 드는 비용이 기본형의 래퍼클래스로 인해 더 크다는 것을 인지할 수 있다.(박싱 언박싱 반복)

스트림은 중간연산, 최종연산이 있고, 유의해야 할 점으로는 스트림으로 변환하면 1회만 사용되고 버려지는데, 이러한 특징으로 인해 최종연산을 실행하면 해당 스트림이 사라지는 것을 인지하고 데이터 처리를 해야한다.

중간연산 : 순차적이지 않고 상황에 맞게 커스텀된다.(스트림의 지연연산특징)

최종연산 : 중간연산을 상황에 맞게 활용 이후 출력된 데이터를 최종처리할 연산을 작성

 

Optional<T> - T타입 객체의 래퍼클래스

  • 해당 객체가 null인지 판단을 하기 때문에 nullSafe하다
  • null체크를 하는데 드는 비용이 줄어든다(if문, try catch 사용필요x)

 

 

반응형

+ Recent posts