programing

람다를 연재하는 방법?

prostudy 2022. 4. 20. 21:47
반응형

람다를 연재하는 방법?

어떻게 하면 우아하게 람다를 연재할 수 있을까?

예를 들어, 아래 코드는NotSerializableException. 생성하지 않고 어떻게 해결할 수 있는가?SerializableRunnable"접속" 인터페이스?

public static void main(String[] args) throws Exception {
    File file = Files.createTempFile("lambda", "ser").toFile();
    try (ObjectOutput oo = new ObjectOutputStream(new FileOutputStream(file))) {
        Runnable r = () -> System.out.println("Can I be serialized?");
        oo.writeObject(r);
    }

    try (ObjectInput oi = new ObjectInputStream(new FileInputStream(file))) {
        Runnable  r = (Runnable) oi.readObject();
        r.run();
    }
}

자바 8은 여러 경계를 추가하여 여러 종류의 교차점에 물체를 캐스팅할 수 있는 가능성을 소개한다.따라서 일련화의 경우 다음과 같이 쓸 수 있다.

Runnable r = (Runnable & Serializable)() -> System.out.println("Serializable!");

그리고 람다 자동 연재가 가능해진다.

방법 참조에도 동일한 구조를 사용할 수 있다.예를 들어 이 코드:

import java.io.Serializable;

public class Test {
    static Object bar(String s) {
        return "make serializable";
    }

    void m () {
        SAM s1 = (SAM & Serializable) Test::bar;
        SAM s2 = (SAM & Serializable) t -> "make serializable";
    }

    interface SAM {
        Object action(String s);
    }
}

직렬화할 수 있는 대상 유형을 사용하여 람다 식 및 메서드 참조를 정의하십시오.

굉장히 못생긴 캐스팅.사용 중인 기능 인터페이스에 대해 직렬화할 수 있는 확장을 정의하고 싶은 경우

예를 들면 다음과 같다.

interface SerializableFunction<T,R> extends Function<T,R>, Serializable {}
interface SerializableConsumer<T> extends Consumer<T>, Serializable {}

그러면 람다를 받아들이는 방법은 다음과 같이 정의될 수 있다.

private void someFunction(SerializableFunction<String, Object> function) {
   ...
}

그리고 그 기능을 부르면서 어떤 추한 캐스팅도 없이 람다를 통과할 수 있다.

someFunction(arg -> doXYZ(arg));

Beam/Dataflow 코드를 만드는 동안 누군가가 여기에 있는 경우:

Beam은 자체 SerialableFunction Interface를 가지고 있으므로 더미 인터페이스나 자세한 캐스트가 필요하지 않다.

Kryo와 같은 다른 직렬화 프레임워크로 전환하려는 경우, 구현된 인터페이스가 구현해야 하는 다중 범위 또는 요구 사항을 제거할 수 있다.Serializable접근방법은

  1. 수정하기InnerClassLambdaMetafactory항상 일련화에 필요한 코드를 생성하다
  2. 직접 전화:LambdaMetaFactory탈직렬화 중에

자세한 내용 및 코드는 이 블로그 게시물을 참조하십시오.

참조URL: https://stackoverflow.com/questions/22807912/how-to-serialize-a-lambda

반응형