以下代码块在1.8.11中可以正常编译,但在1.8.20中会引发错误
private static String calculateSyntheticOrderTypePrice( FluentIterable<? extends CalculatorProvider> pendingProviders ) { FluentIterable <? extends CalculatorProvider> mlsLegProvidersAll = pendingProviders.filter(Predicates.and( IS_MLS_PROVIDER, Predicates.not(IS_SYNTHETIC))); FluentIterable <? extends CalculatorProvider> mlsLegProvidersNewest = reduceToNewestMlsPrices(mlsLegProvidersAll); FluentIterable <? extends CalculatorProvider> otherLegProviderAll = pendingProviders.filter(Predicates.and( Predicates.not(IS_MLS_PROVIDER), Predicates.not(IS_SYNTHETIC))); FluentIterable <String> mlsHeadPriceTypes = mlsLegProvidersNewest.transform(TO_MLS_SPREAD_PRICE_FUN); /* MLS head: spread price */ FluentIterable <String> orderPriceTypes = otherLegProviderAll.transform(TO_ORDER_TYPE_PRICE_FUN); /* non-MLS orders: option spread or pairs */ FluentIterable <String> formattedOrderHeadPriceTypes = orderPriceTypes.transform(new FormatOrderTypePriceFun(creditOrDebit(otherLegProviderAll))); FluentIterable <String> allFormatted = FluentIterable.from(Iterables.concat(mlsHeadPriceTypes, formattedOrderHeadPriceTypes)); return CalculatorValues.rollupStrings(allFormatted); }
我得到的错误是java:找不到适合过滤器的方法(com.google.common.base.Predicate)
在更新8和20之间是否存在会影响此代码的更改?我在两种情况下都使用相同版本的guava 17.0(最新版本),唯一的变化是Java中的更新版本。
任何帮助是极大的赞赏。
编辑
显示错误的行是
FluentIterable <? extends CalculatorProvider> mlsLegProvidersAll = pendingProviders.filter(Predicates.and( IS_MLS_PROVIDER, Predicates.not(IS_SYNTHETIC)));
这很可能是JDK-8051402,它是在JDK 8u11之后引入的,发现于JDK 8u20中,但为时已晚,已在JDK 8u20之后进行了修复。该修复程序出现在JDK 8u40早期访问快照内部版本b02和JDK 9早期访问快照内部版本b27中。
这是说明问题的最小化代码片段:
public class X { static Predicate<Number> IS_SYNTHETIC = p -> false; static Predicate<Number> IS_MLS_PROVIDER = p -> true; static void calcSynth(Stream<? extends Number> providers) { Stream<? extends Number> all = providers.filter(Predicates.and(IS_MLS_PROVIDER, Predicates.not(IS_SYNTHETIC))); } } class Predicates { static <T> Predicate<T> and(Predicate<? super T> p1, Predicate<? super T> p2) { return x -> p1.test(x) && p2.test(x); } static <T> Predicate<T> not(Predicate<T> p) { return x -> !p.test(x); } }
这在JDK 8u11的javac上有效,在JDK 8u20上失败,然后在JDK 8u40-b02和JDK9-b27上又有效。