2016-03-10 17 views
9

đang nguồn (tất nhiên các dự án có nhiều lớp khác)Tại sao là tên được tạo ra cho một lớp lambda không giống nhau cho các chương trình giống hệt

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 dự án con đường khác

d: \ Users \ shell \ Documents \ nơi làm việc \ bak \ 1

d: \ Users \ shell \ Documents \ nơi làm việc \ bak \ 2

2.execute gói mvn trong cả hai con đường

3.check tập tin lớp

thực hiện lệnh javap -p trong d: \ Users \ shell \ Documents \ nơi làm việc \ bak \ 1 \ data \ mục tiêu \ lớ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); 
} 

thực hiện lệnh javap -p trong d: \ Users \ Shell \ Documents \ nơi làm việc \ bak \ 2 \ data \ mục tiêu \ lớ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); 
} 

tại sao số lượng chức năng lambda là khác nhau?

có cách nào để tôi có thể làm cho chúng giống nhau không?

+4

Tại sao tên của phương pháp lamba lại quan trọng đối với bạn? Lưu ý rằng nó là riêng tư, vì vậy không nên ảnh hưởng đến bất kỳ lớp nào khác. – Thilo

+0

fork = true không hoạt động đối với tôi. – shell

+0

@Thilo không thể nói cho OP, nhưng có một đầu ra xác định, nhất quán có thể giúp xây dựng phức tạp nhanh hơn bằng cách bỏ qua một số phần –

Trả lời

13

Nhìn vào nguồn javac, bạn có thể nhận thấy rằng the corresponding counter (được thêm vào tên phương thức lambda) được định nghĩa là trường mẫu trong LambdaAnalyzerPreprocessor được sử dụng lại cho toàn bộ quá trình biên dịch. Nó tăng lên trên mỗi lần xuất hiện lambda. Vì vậy, nếu tôi lập lớp học của bạn mà thôi, tôi sẽ có số bắt đầu từ 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); 
} 

Nhưng nếu tôi có thể tạo thêm một lớp

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

Và biên dịch chúng lại với nhau tôi sẽ thấy truy cập tăng lên:

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

Vì vậy đây không phải là vấn đề về maven, đây là cách trình biên dịch javac hoạt động.

Nếu bạn chắc chắn cần kết quả biên dịch ổn định, tôi có thể đề nghị bạn thử Trình biên dịch Eclipse cho Java. Dường như nó không có vấn đề như vậy:

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

Tham khảo this question về cách tích hợp ecj với maven.

+0

làm việc cho tôi, cảm ơn rất nhiều! – shell

Các vấn đề liên quan