자바 커링

3725 단어 java
Java에서 커링을 수행하는 방법에 대한 몇 가지 예를 살펴보겠습니다.

여기에서 전체 코드를 찾을 수 있습니다: curry_example.jsh .

Currying은 n 매개변수가 있는 함수를 취하고 원래 함수의 n 매개변수에 도달할 때까지 하나의 매개변수가 있는 함수를 반환하는 하나의 매개변수가 있는 함수를 반환한 다음 결과를 얻는 것입니다.

다음 메서드는 서명이 있는 메서드의 커리 버전을 가져옵니다.

int methodName(int a, int b)


그리고 커링된 버전을 반환합니다.

public static Function<Integer, Function<Integer, Integer>> toCurry(
    BiFunction<Integer, Integer, Integer> function) {
  return v -> v1 -> function.apply(v, v1);
}


그런 다음 이를 사용하여 이러한 메서드의 카레 버전을 얻을 수 있습니다.

var curriedAdd = toCurry(Math::addExact);
var curriedMultiply = toCurry(Math::multiplyExact);


다음과 같이 사용하십시오.

System.out.format("curriedAdd(2)(10): %d\n",curriedAdd.apply(2).apply(10));
System.out.format("curriedMultiply(2)(10): %d\n",curriedMultiply.apply(2).apply(10));


다음 예에서는 커링된 ​​버전을 사용하여 먼저 1을 더한 다음 스트림의 모든 요소에 2를 곱합니다.

var add1 = toCurry(Math::addExact).apply(1);
var multiplyBy2 = toCurry(Math::multiplyExact).apply(2);
List.of(0, 1, 2, 3, 4).stream().map(add1).map(multiplyBy2).forEach(System.out::println);

partial application 의 형태로 커링을 사용할 수 있습니다. 다음과 같은 방법이 있다고 상상해 보세요.

public static String wget(
    int connectionTimeout,
    int readTimeout,
    boolean followRedirects,
    String requestMethod,
    String address) {
  try {
    URL url = new URL(address);
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod(requestMethod);
    con.setConnectTimeout(connectionTimeout);
    con.setReadTimeout(readTimeout);
    con.setInstanceFollowRedirects(followRedirects);
    return address + " " + con.getResponseCode();
  } catch (Exception e) {
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    String stackTrace = sw.toString();
    return address + " " + stackTrace.substring(0, stackTrace.indexOf("\n"));
  }
}


이 메소드는 http status 또는 발생한 경우 예외의 일부를 반환합니다.

이렇게 사용하면 함수를 사용할 때마다 모든 매개변수를 설정해야 하지만 커리 버전이 있는 경우:

public static Function<Integer, Function<Boolean, Function<String, Function<String, String>>>>
    cwget(int v) {
  return v1 -> v2 -> v3 -> v4 -> wget(v, v1, v2, v3, v4);
}


그런 다음 가지고 있는 매개변수를 설정할 수 있습니다.

var get = cwget(100).apply(100).apply(false).apply("GET");


그런 다음 함수를 사용할 때 이름 바꾸기 매개변수를 채우십시오.

List.of(
        "https://www.google.com",
        "https://www.wikipedia.org",
        "asdf",
        "https://docs.oracle.com/javase/10/docs/api/java/net/package-summary.html",
        "https://jsedano.dev",
        "https://raw.githubusercontent.com/center-key/clabe-validator/main/clabe.ts")
    .parallelStream()
    .map(get)
    .forEach(System.out::println);


이 게시물에서 전체 코드를 다운로드하십시오: curry_example.jsh .

좋은 웹페이지 즐겨찾기