1

我正在为 android 开发并使用 jitpack.io 从 git 编译 gradle

我试图使用 git 中的这个库进行函数式编程:

fj - Java 7 的函数式编程

即使一切都经过测试,我也运行了代码并得到了错误。

问题出在 GroupBy 类中:

源代码:

public Collection<Group<S,T>> execute(Collection<T> collection){
    Hashtable<S, Group<S, T>> groups = new Hashtable<S, Group<S, T>>();

    for (T item: collection){
        S classification = grouper.select(item);

        if (!groups.contains(classification)){
            groups.put(classification, new Group<S, T>(classification));
        }
        groups.get(classification).add(item);
    }

    return groups.values();
}

反编译代码:

public Collection<GroupBy.Group<S, T>> execute(Collection<T> collection) {
    Hashtable groups = new Hashtable();

    Object item;
    Object classification;
    for(Iterator var3 = collection.iterator(); var3.hasNext(); ((GroupBy.Group)groups.get(classification)).add(item)) {
        item = var3.next();
        classification = this.grouper.select(item);
        if(!groups.contains(classification)) {
            groups.put(classification, new GroupBy.Group(classification));
        }
    }

    return groups.values();
}

我将不胜感激任何帮助。

目前我看不出代码看起来不同的任何原因

谢谢

4

1 回答 1

1

简短的回答是,当编译 java 时,信息会丢失。但是,反编译的代码功能与您编写的代码完全相同。

让我们一行一行的看...

public Collection<GroupBy.Group<S, T>> execute(Collection<T> collection) {

这是相同的,尽管它给了Group类它的全名。

    Hashtable groups = new Hashtable();
    Object item;
    Object classification;

正如您在此处看到的,变量名称和所有通用信息都丢失了。java中的泛型可以被认为是编译器检查错误的提示。一旦编译器完成编译,信息就会被丢弃(通常)。

    for(
        Iterator var3 = collection.iterator(); 
        var3.hasNext();                         
        ((GroupBy.Group)groups.get(classification)).add(item)
    ) {

增强的 for 循环已被经典的 for 循环所取代。这是因为在字节码中它们是相同的东西(尽管更聪明的反编译器可能已经发现了这一点并在此处编写了增强的 for 循环)。

另一件有趣的事是编译器已将groups.get(...).add(...)语句放入您的 for 循环中。如果您考虑 then 的合同,for(initialisation; termination; increment)increment在每次循环迭代时都会发生。因此,即使您在循环中编写语句,效果也是一样的。[这样做可能有充分的理由,虽然我不是编译器专家,所以我不能肯定地说]。

        item = var3.next();
        classification = this.grouper.select(item);
        if(!groups.contains(classification)) {
            groups.put(classification, new GroupBy.Group(classification));
        }
    }

    return groups.values();
}

其余代码与您编写的几乎完全相同。

于 2016-06-07T17:27:42.760 回答