我正在认真考虑将默认方法添加到Java 8 Iterable/List/
等中。而不是通过stream/static
方法的当前方法,这使得我的代码相当长且难以阅读,特别是对于需要简单列表过滤/组合的许多小代码,例如:
printLines(myList.filter(a -> a.alive).map(a -> a.name))
据我所知,这需要编译和执行我的代码的所有环境都在jre\lib\endorsed
中包含特定的jar,但这对我们的项目无关紧要,因为它必须附带嵌入式 JRE 。二进制兼容性是可以的,如Java 8文档中所述。二进制许可证中也忽略了背书方法(与-Xbootclasspath不同)。我还应该考虑什么?有人或任何项目已经完成了吗?
答案 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项目)。