Java를 사용한 기능 구현

자바는 출시 이래 줄곧 most popular language 가장 인기 있는 언어였다. 왜냐하면 자바의 창조자는 이 언어가 어떤 것도 빠뜨리지 않고, 끊임없이 변화하는 가운데 그 독창성을 유지하기 때문이다.

함수식 프로그래밍


함수식 프로그래밍은 lambda 연산의 계발을 받은 프로그래밍 개념이다.이 개념에서 모든 계산은 하나의 함수로 간주된다.이 기능들이 범위 밖에서 상태/데이터를 변경할 수 없음에도 불구하고.

왜?


소프트웨어 개발은 코드를 작성하는 과정일 뿐만 아니라 다른 사람이 작성한 코드를 이해하는 과정이기도 하다.
너는 그것이 매우 도전적이라는 것을 발견할 수 있을 것이다. 반대로도 마찬가지다. D
만약 특정한 대상의 상태가 매개 변수의 함수로 변경된다면, 그 대상의 상태를 찾아내는 데 많은 시간이 걸릴 수 있다.따라서 절차의 행동을 예측하기 어렵다.
문서가 없는 타사 API로 간주합니다.특정 함수를 호출할 때 어떤 행동이 일어날지 확인하지 못했습니다.
이것은 함수식 프로그래밍의 개념과 다르다.상태 변경과 가변 데이터를 허용하지 않기 때문에 side-effects 를 피할 수 있습니다.

어떻게 써요?


이 모든 이론들은 다 좋은데 자바 개발자로서 어떻게 사용해야 하나요?
너희들 대다수의 사람들은 틀림없이 이 문제를 생각하고 있을 것이다.정답은 자바 가문 람다의 새 멤버다.

람다


Lambda는 객체와 유사한 역할을 하는 함수입니다.어디든 통과할 수 있다.필요할 때 실행할 수 있습니다.한 행에서 정의할 수 있습니다.클래스 없이 만들 수 있습니다.더 많아요.Java에 이전에 필요한 많은 템플릿 코드를 삭제하는 데 도움이 됩니다.
Syntax - (Parameter Declaration) -> {Lambda Body}
Examples -
Without parameters - () -> System.out.println("Hello lambda")
With one parameter - s -> System.out.println(s)
With two parameters - (x, y) -> x + y
With multiple line body - (x, y) -> {}
멋있죠?그런데 자바는 어떤 lambda가 어떤 함수에 비치는지 어떻게 알아요?

깊이 파다


인터페이스가 lambdas의 주간이기 때문이다.자바는 함수 인터페이스라는 새로운 개념을 도입했는데 lambda는 이 개념에 따라 정의된 것이다.

기능 인터페이스


그것들은 자바의 일반 인터페이스와 비슷하지만, 주요한 차이가 있다.그들은 샘의 규칙을 따른다.SAM 규칙에 따라 인터페이스는 단일 추상 방법(SAM)만 사용할 수 있습니다.
이 체크는 컴파일할 때 @FunctionInterface 주석을 사용하여 강제로 수행할 수 있습니다.
모든 lambda에 대해 새로운 기능 인터페이스를 만들어야 합니까?
이것은 매우 편리하다.맞습니까?
보아하니 자바가 이미 이 문제를 해결한 것 같다.
패키지 자바.util.함수는 50개에 가까운 기능 인터페이스를 포함한다.너는 그들의 범위를 넘어서는 물건을 필요로 할 리가 없다.

기능 인터페이스 제품군


모든 인터페이스를 파악하는 것은 매우 어려운 것 같다.반대로 만약 우리가 그들의 가정을 이해하기만 한다면 우리는 정확한 인터페이스를 쉽게 가리킬 수 있다.
기능 인터페이스에는

소비자 - 소비 및 폐기


@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}
그것은 대상을 받아들여 일부 조작을 실행하지만 출력을 되돌려 주지 않는다.그러니까 내 말은: D

예제 -
Consumer<String> stringConsumer = string -> System.out.println(string);
lambda 함수와 println () 은 모두 같은 매개 변수를 받아들일 수 있기 때문에 다음과 같이 인용하여 작성할 수도 있습니다 -
Consumer<String> stringConsumer = System.out::println;

함수 - 매핑, 변환 또는 계산


@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}
그것은 하나의 대상을 받아들여 일부 조작을 한 후에 다른 대상으로 되돌아간다.

예제 -
Function<String, String> stringStringFunction = String::toUpperCase;

술어-테스트 또는 선별


@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}
그것은 대상을 받아들이고 부울 값을 되돌려줍니다.일반적으로 규칙을 정의합니다.

예제 -
Predicate<String> stringPredicate = String::isEmpty;

협력업체 - 작성


@FunctionalInterface
public interface Supplier<T> {
    T get();
}
그것은 어떤 내용도 받아들이지 않지만, 대상을 되돌려줍니다.매우 관대하다: D

예제 -
Supplier<String> stringSupplier = () -> "Hello, World";

현실 세계


이제는 우리의 지식을 현실 세계의 도전에 응용할 때가 되었다.HackerRankcamelCase로부터 기본적인 프로그래밍 도전을 배워봅시다.
Problem - Count number of words in a camelCase string.

Example - saveChangesInTheEditor
Result - 5
그래서 우리의 목적은 이 문제를 해결하는 것이 아니라 함수의 방법으로 그것을 해결하는 것이다.
해결 방안은 문자열의 대문자 수를 직접 계산한 결과count+1이다.
실용적인 방식으로 이 점을 실현하려면
  • 문자열의 단일 문자 흐름 및
  • 대문자의 술어를 필터하는 데 도움을 줍니다.
  • Solution -
    
    /* Stream - s.chars()
    Predicate - Character::isUpperCase */
    
    static long camelcase(String s) {
        return s.chars().filter(Character::isUpperCase).count() + 1;
    }
    

    안녕하세요!


    하나의 선만 있으면 문제가 해결된다.
    이런 방법은 개발자가 코드 단편의 행위를 쉽게 이해하도록 도와줄 수 있다.위의 줄은 문자열에서 대문자를 필터하고 값을 되돌려주는 것으로 이해하기 쉬우며 부작용이 없습니다.그게 우리가 원하는 거야.
    비록 실용적으로 변한 것은 상술한 예에 국한되지 않는다.그것은 경험에 근거하여 발전된 것이다. 왜냐하면 그것은 우리가 문제를 어떻게 처리하는지에 관한 것이기 때문이다.
    자바 개발자는 이런 방법을 배우기 위해 별도의 노력을 기울여야 할 수도 있다. 왜냐하면 우리의 뇌는 훈련을 거쳐 필요한 것보다 더 많은 코드를 만들 수 있기 때문이다D

    좋은 웹페이지 즐겨찾기