2016-03-10 2 views
9

Quellcode (natürlich das Projekt viele andere Klassen)Warum ist der generierte Name für eine Lambda-Klasse nicht das gleiche für identische Programme

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.Kopieren Projekt zu anderen Weg

d: \ Benutzer \ shell \ Dokumente \ Arbeitsplatz \ bak \ 1

d: \ Benutzer \ shell \ Dokumente \ Arbeitsplatz \ bak \ 2

2.execute MVN Paket in beiden Bahn

3.Check der Klassendatei

Befehl javap -p in d ausführen: \ Benutzer \ shell \ Dokumente \ Arbeitsplatz \ bak \ 1 \ data \ classes \ Ziel

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

Befehl javap -p in d ausführen: \ Benutzer \ Shell \ Documents \ Arbeitsplatz \ bak \ 2 \ data \ target \ Klassen

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

warum die Zahl der Lambda-Funktion ist anders?

Gibt es eine Möglichkeit, ich kann sie gleich machen?

+4

Warum ist der Name der Lamba-Methode für Sie wichtig? Beachten Sie, dass es auch privat ist und keine anderen Klassen beeinflussen sollte. – Thilo

+0

fork = true funktioniert nicht für mich. – shell

+0

@Thilo kann nicht für das OP sprechen, aber eine deterministische, konsistente Ausgabe kann große komplexe Builds schneller machen, indem einige Teile übersprungen werden. –

Antwort

13

Blick in Javac Quelle können Sie feststellen, dass the corresponding counter (der mit den Lambda-Methodennamen angehängt wird) als Instanz-Feld in den LambdaAnalyzerPreprocessor definiert ist, die für den gesamten Übersetzungsvorgang wiederverwendet wird. Es wird bei jedem Auftreten von Lambda erhöht. Also, wenn ich nur die Klasse kompilieren, muss ich Zahlen von 0 gestartet:

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

Aber wenn ich noch einen erstellen Klasse

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

Und kompilieren sie zusammen werde ich sehen, der Zähler erhöht:

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

Das ist also nicht das Maven-Problem, so funktioniert der Javac-Compiler.

Wenn Sie unbedingt stabile Kompilierungsergebnisse benötigen, kann ich Ihnen den Eclipse Compiler für Java empfehlen. Es scheint, dass es kein solches Problem hat:

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

Siehe this question wie ecj mit Maven zu integrieren.

+0

Arbeit für mich, vielen Dank! – shell

Verwandte Themen