Java:将默认方法添加到Iterable / List / ...?

时间:2014-08-14 19:10:55

标签: java java-8 java-stream

我正在认真考虑将默认方法添加到Java 8 Iterable/List/等中。而不是通过stream/static方法的当前方法,这使得我的代码相当长且难以阅读,特别是对于需要简单列表过滤/组合的许多小代码,例如: printLines(myList.filter(a -> a.alive).map(a -> a.name))

据我所知,这需要编译和执行我的代码的所有环境都在jre\lib\endorsed中包含特定的jar,但这对我们的项目无关紧要,因为它必须附带嵌入式 JRE 。二进制兼容性是可以的,如Java 8文档中所述。二进制许可证中也忽略了背书方法(与-Xbootclasspath不同)。我还应该考虑什么?有人或任何项目已经完成了吗?

1 个答案:

答案 0 :(得分:0)

jre \ lib \ endorsed有效。通过运行Eclipse / IntelliJ / NetBeans和LWJGL / JOGL演示进行测试,没有任何问题。

我必须使用OpenJDK中的源来避免许可证问题;新的默认方法放在分隔的类中,例如:

public interface Iterable<T> extends IterableExt<T> {
    Iterator<T> iterator();
    ....
}
public interface IterableExt<T> {
    default boolean all(Predicate<? super T> filter)
    {
        for (T item : (Iterable<T>) this)
        {
            if (!filter.test(item))
            {
                return false;
            }
        }
        return true;
    }

    default Iterable<T> filter(Predicate<? super T> filter)
    {
        Iterable<T> thiz = (Iterable<T>) this;
        return () -> new FilteredIterator<>(thiz.iterator(), filter);
    }
}

部署非常简单:只需将所有内容包装到jar中并放入%JRE_HOME%\ lib \ endorsed即可。由于它适用于整个系统并锁定在Windows上,因此无法在不停止所有Java程序的情况下进行升级。

另一个问题是Eclipse编译的类在稍后由javac引用时(坏类文件等)不起作用,但javac的重新编译适用于两者。

编辑:我将源代码上传到公共域下的https://github.com/AqD/JXTN(.axi项目)。