왜 나 자바 람다 식의 작동할 수 없습니다 그 필수적 스타일 제대로 작동합니까?

0

질문

가 년의 경험 Java8 과 람다. 하지만 내가 만난 미친 문제를 개발 하는 경우 안녕하세요-세계-크기는 점화 프로그램입니다.

여기에 나는 Java 클래스에서는 데이터 주석에서 Lombok:

@Data
public class Person implements Serializable {
  private String name;
  private Long age;
}

그리고 나는 내 자의 개체를 포함하는 Persion 클래스:

        Person p1 = new Person("sb", 1L);
        Person p2 = new Person("sth", null);
        List<Person> list = new ArrayList<>(2);
        list.add(p1);
        list.add(p2);

그래서 지금까지 좋은. 그리고 나는 시도를 생성하는 불꽃을 사용하여 데이터 집합 목록:

SparkSession session = SparkSession.builder().master("local[1]").appName("SparkSqlApp").getOrCreate();
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> dataset1 = session.createDataset(list, personEncoder);
dataset1.foreach(new ForeachFunction<Person>() { // 1
            @Override
            public void call(Person person) throws Exception {
                System.out.println(person);
            }
});
dataset1.foreach((ForeachFunction<Person>) System.out::println); //2

지,블록 1 에 해당하는 블록 2java 및 블록 2 단순화에서 블록 1 의 IntelliJ IDEA. 유일한 차이점은 2 블록을 사용하 lambda expression.

그러나 때,나는 프로그램을 실행하여 블록 1 끝을 잘하는 동안 2 차단 실행에 예외: enter image description here

무엇을...큰 땅과 큰 우주? 왜 JVM 또는 불꽃 엔진 같은 것들이?!

apache-spark-sql java java-8 jvm
2021-11-24 03:11:05
2

최고의 응답

7

로 설명에서 무엇을 해당하는 람다 식를 위한 시스템입니다.아웃::println방법 참조 System.out::println 이 동일하지는 람다 식 x -> System.out.println(x).

의 방법을 참조 캡처 의 현재 값 System.out실행하기 println 에서 그것은 때마다 함수가 호출됩니다,보다는 오히려 평가 System.out 다시 각각의 시간으로 람다 식의 몸 않습니다.

으로도 말했다,이는 거의 차이가 있지만,여기에,그것은 않습니다. 려고 하면 직렬화 기능,그것도 직렬화 촬영한 모든 값을 포함하여, PrintStream 인스턴스에서 읽 System.out 인스턴스화하는 동안. 이 PrintStream 는 직렬화되지 않고 매우 도전을 구현하는 직렬화 PrintStream 을 기대합니다.

하지만 그것을 유지하는 것이 중요 마음에서는 직렬화할 때는 람다 식 x -> System.out.println(x) 또는 이와 동등한 클래스를 개체 및 직렬화에서 서로 다른 환경 System.out 그것을 읽기 평가를 다른 PrintStream 이상에서 수 있습니다. 이 중요하지 않을 때 컴퓨팅 분산 프레임워크에 관리를 파이프는 모든 인쇄를 표준출력에 다시 창시자이다.

하지만 그것이 중요하다 하는 마음에 static 필드지 않은 부분의 직렬화된 데이터에 있는 다른 내용을 서로 다른 환경에서 일반적입니다.

2021-11-24 08:36:53

같은 소리가 발생만 System.out까?나는 그것을 대체 로그 프레임워크 및 빅뱅! 그것은 성공했다. ForeachFunction<String> functionBody = log::info;
Sheldon Wei

에 따라 달라집깅 framework. 그것은 작동하는 경우 log 는 직렬화.
Holger

그것은 보인다되지 않습과 관련합니다. 내가 사용하는 java.util.logging.Logger 하지 않은 직렬화.
Sheldon Wei

지에 대한 기준 설정: ideone.com/F5lQZF "NotSerializableException:java.util.logging.Logger". 그러나,특정 환경에서,로그 관리자를 반환할 수 있습의 서브 클래스 Logger 으로 직렬화(또는 RMI)지원,또한,프레임 워크 사용할 수 있는 확장된 직렬화할 수 있는 손잡이거에는 특별한 방법입니다.
Holger
1

인터페이스 ForeachFunction 확장 Serializable. Dataset.foreach(f) 될 수 있 직렬화하수 f. 에서는 다음 테스트 testBlock1 성공고 testBlcok2 실패(NotSerializableException). 그러나 나는 이유는 모르겠지만.

public class AAA implements Serializable {

    @FunctionalInterface
    public interface ForeachFunction<T> extends Serializable {
        void call(T t) throws Exception;
    }

    @Test
    public void testBlock1() throws FileNotFoundException, IOException {
        ForeachFunction<String> functionBody = new ForeachFunction<String>() {
            public void call(String t) throws Exception {
                System.out.println(t);
            }
        };
        try (FileOutputStream fos = new FileOutputStream("data/block1.obj");
            ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(functionBody);  // success
        }
    }

    @Test
    public void testBlock2() throws FileNotFoundException, IOException {
        ForeachFunction<String> functionBody = System.out::println;
        try (FileOutputStream fos = new FileOutputStream("data/block2.obj");
            ObjectOutputStream oos = new ObjectOutputStream(fos)) {
            oos.writeObject(functionBody);  // fail (NotSerializableException)
        }
    }
}
2021-11-24 06:44:55

테스트의 경우 그리고 실제로,이벤트 functionBody = t -> System.out.println(t) 은 성공을 거둘 수있을 것이다. 그래서 이 문제의 원천 겠는 방법을 참조합니다. 당신은 나에게 거대한다.
Sheldon Wei

는 경우 테스트 클래스 AAA 을 구현하지 않습 Serializable 내 코드 testBlock1 도 실패합니다. 이 functionBodytestBlock1 익명의 내부 클래스의 테스트 클래스 AAA 해야 합 직렬화와 클래스의 인스턴스 AAA 을 둘러싸는니다. 그러나, functionBodytestBlock2 내부 클래스 클래스 AAA 과하지 않는 것을 구현할 Serializable 에서는 물질이다.
英語は苦手

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................