2016-03-10 10 views
9

kod źródło (oczywiście projekt mają wiele innych zajęć)Dlaczego jest generowana nazwa dla klasy lambda nie jest taka sama dla identycznych programów

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.Copy projekt do innej ścieżce

d: \ użytkownicy \ \ \ Documents powłoki w miejscu pracy \ bak \ 1

d: \ Users \ \ \ Documents powłoki w miejscu pracy \ bak \ 2

2.execute pakiet mvn zarówno ścieżki

3.Sprawdź pliku klasy

wykonać polecenia javap -pw D: \ Users \ shell \ Documents \ pracy \ bak \ 1 \ data \ Classes \ docelowe

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); 
} 

wykonania polecenia javap -pw D: \ Users \ shell \ Documents \ pracy \ bak \ 2 \ data \ target \ Classes

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); 
} 

dlaczego liczba funkcji lambda jest inaczej?

Czy jest jakiś sposób, aby zrobić to samo?

+4

Dlaczego nazwa metody lamba ma dla ciebie znaczenie? Zauważ, że jest to również prywatne, więc nie powinno wpływać na żadne inne klasy. – Thilo

+0

fork = true nie działa dla mnie. – shell

+0

@Thilo nie może mówić za OP, ale posiadanie deterministycznego, spójnego wyniku może przyspieszyć tworzenie złożonych kompilacji poprzez pomijanie niektórych części –

Odpowiedz

13

Patrząc źródła javac można zauważyć, że the corresponding counter (który jest dołączany do nazwy metody lambda) jest zdefiniowany jako pole instancji w LambdaAnalyzerPreprocessor które są ponownie wykorzystywane dla całego procesu kompilacji. Zwiększa się przy każdym zdarzeniu lambda. Więc jeśli skompilować klasę tylko będę mieć numery zaczęła od 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); 
} 

Ale jeśli utworzyć jedną klasę

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

i skompilować je razem ujrzę licznik zwiększany:

> 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); 
} 

To nie jest problem, tak działa kompilator javac.

Jeśli na pewno potrzebujesz stabilnych wyników kompilacji, możesz zasugerować, aby wypróbować Eclipse Compiler dla Java. Wygląda na to, że nie ma takiego problemu:

>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); 
} 

zobacz this question w jaki sposób zintegrować ETS z Maven.

+0

pracuj dla mnie, wielkie dzięki! – shell

Powiązane problemy