2016-03-10 2 views
9

исходного код (конечно, проекта есть много других классов)Почему сгенерированное имя для класса лямбды не одинаковы для идентичных программ

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Optional; 
import java.util.function.Function; 
import java.util.stream.Stream; 


public class Test { 
    public static void main(String[] args) { 
     Map<Integer, Integer> src = new HashMap<>(); 
     Map<Integer, List<Integer>> dst = new HashMap<>(); 
     Optional<Object> f = dst.values().stream().flatMap((Function<List<Integer>, Stream<?>>) integers -> integers.stream()).filter(b -> !src.containsKey(b)).findFirst(); 
     f.ifPresent(b -> { 
      throw new IllegalStateException("exception [" + b + "]"); 
     }); 
    } 
} 

1.Копирование проект по другому пути

d: \ Users \ оболочки \ Documents \ рабочее место \ Бак \ 1

d: \ Users \ оболочки \ Documents \ рабочем месте \ Бак \ 2

2.execute МВН пакет как в пути

3.check файла класса

выполнить команду javap -p в D: \ Users \ Shell \ Documents \ рабочее место \ безналу \ 1 \ Data \ \ целевые классы

public class Test { 
    public Test(); 
    public static void main(java.lang.String[]); 
    private static void lambda$main$84(java.lang.Object); 
    private static boolean lambda$main$83(java.util.Map, java.lang.Object); 
    private static java.util.stream.Stream lambda$main$82(java.util.List); 
} 

выполнить команду javap -p в D: \ Users \ оболочки \ Документы \ на рабочем месте \ безналу \ 2 \ Data \ \ целевые классы

public class Test { 
    public Test(); 
    public static void main(java.lang.String[]); 
    private static void lambda$main$75(java.lang.Object); 
    private static boolean lambda$main$74(java.util.Map, java.lang.Object); 
    private static java.util.stream.Stream lambda$main$73(java.util.List); 
} 

почему число лямбда-функции отличается?

Есть ли способ, я могу сделать их такими же?

+4

Почему для вас имеет значение метод lamba? Обратите внимание, что он тоже закрыт, поэтому он не должен влиять на другие классы. – Thilo

+0

fork = true не работает для меня. – shell

+0

@Thilo не может говорить для OP, но наличие детерминированного последовательного выхода может помочь сделать большие сложные сборки быстрее, пропуская некоторые части. –

ответ

13

Глядя на источник JAVAC вы можете заметить, что the corresponding counter (который добавляется к имени методы лямбды) определяются как поле экземпляра в LambdaAnalyzerPreprocessor, который повторно используется в течение всего процесса компиляции. Он увеличивается при каждом появлении лямбды. Так что, если я скомпилировать класс только у меня будет номера, начинающегося от 0:

> javac Test.java 
> javap -p Test 
Compiled from "Test.java" 
public class Test { 
    public Test(); 
    public static void main(java.lang.String[]); 
    private static void lambda$main$2(java.lang.Object); 
    private static boolean lambda$main$1(java.util.Map, java.lang.Object); 
    private static java.util.stream.Stream lambda$main$0(java.util.List); 
} 

Но если я создаю еще один класс

public class Test2 { 
    Runnable r =() -> {}; 
} 

И собрать их вместе я буду видеть, счетчик увеличивается:

> javac Test2.java Test.java 
> javap -p Test 
Compiled from "Test.java" 
public class Test { 
    public Test(); 
    public static void main(java.lang.String[]); 
    private static void lambda$main$3(java.lang.Object); 
    private static boolean lambda$main$2(java.util.Map, java.lang.Object); 
    private static java.util.stream.Stream lambda$main$1(java.util.List); 
} 

Так что это не проблема maven, так работает компилятор javac.

Если вам действительно нужны стабильные результаты компиляции, я могу предложить вам попробовать Eclipse Compiler для Java. Кажется, что у него нет такой проблемы:

>java -jar org.eclipse.jdt.core_3.11.1.v20150902-1521.jar -8 Test2.java Test.java 
>javap -p Test 
Compiled from "Test.java" 
public class Test { 
    public Test(); 
    public static void main(java.lang.String[]); 
    private static java.util.stream.Stream lambda$0(java.util.List); 
    private static boolean lambda$1(java.util.Map, java.lang.Object); 
    private static void lambda$2(java.lang.Object); 
} 

Обратитесь к this question о том, как интегрировать СЕС с Maven.

+0

Работа для меня, спасибо большое! – shell

Смежные вопросы