为什么对于相同的程序,lambda类的生成名称不相同

she*_*ell 9 lambda maven java-8

源代码(当然项目有很多其他类)

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 + "]");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

1.copy项目到不同的路径

d:\用户\壳\文件\工作场所\ BAK\1

d:\用户\壳\文件\工作场所\ BAK\2

2.在两个路径中执行mvn包

3.检查类文件

d:\ Users\shell\Documents\workplace\bak\1\data\target\classes中执行命令javap -p

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);
}
Run Code Online (Sandbox Code Playgroud)

d:\ Users\shell\Documents\workplace\bak\2\data\target\classes中执行命令javap -p

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);
}
Run Code Online (Sandbox Code Playgroud)

为什么lambda函数的数量不同?

有什么方法可以让他们一样吗?

Tag*_*eev 13

查看javac源代码,您可能会注意到相应的计数器(附加到lambda方法名称)被定义为一个实例字段,该字段在LambdaAnalyzerPreprocessor整个编译过程中被重用.它在每次lambda事件时递增.所以如果我只编译你的类,我将从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);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我再创建一个类

public class Test2 { 
    Runnable r = () -> {};
}
Run Code Online (Sandbox Code Playgroud)

并将它们编译在一起我将看到计数器递增:

> 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);
}
Run Code Online (Sandbox Code Playgroud)

所以这不是maven问题,这就是javac编译器的工作原理.

如果您肯定需要稳定的编译结果,我建议您尝试使用Eclipse Compiler for 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);
}
Run Code Online (Sandbox Code Playgroud)

关于如何将ecj与maven集成,请参阅此问题.