【发布时间】:2016-10-14 15:34:33
【问题描述】:
此代码是从参考中复制的,但它在 Intellj 中显示编译错误:
Stream locales = Stream.of(Locale.getAvailableLocales());
Map<String, Set<String>> countryToLanguages = locales.collect(
groupingBy(l -> l.getDisplayCountry(),
mapping(l -> l.getDisplayLanguage(),
toSet())));
编译器将名为“l”的对象和 java 对象视为不是语言环境;所以它无法理解 l.getDisplayCountry() 和 l.getDisplayLanguage() 方法。
Project SDK 也是 java 8,项目语言级别是 8- lambdas、类型注释等。
【问题讨论】:
-
你使用的是原始类型,它应该是
Stream<Locale> locales。 -
或者根本不将流存储在局部变量中。这样做没有任何好处,它只会打开意外使用 Stream 两次的可能性。此外,如果您有一个数组而不是 varargs,则更喜欢
Arrays.stream而不是Stream.of:Map<String, Set<String>> countryToLanguages = Arrays.stream(Locale.getAvailableLocales()).collect( groupingBy(l -> l.getDisplayCountry(), mapping(l -> l.getDisplayLanguage(), toSet()))); -
顺便说一句,你可以使用方法引用,那么,没有变量
l担心它的类型:Map<String, Set<String>> countryToLanguages = Arrays.stream( Locale.getAvailableLocales()) .collect( groupingBy(Locale::getDisplayCountry, mapping(Locale::getDisplayLanguage, toSet()))); -
@AlexisC。是的,我写了这部分,忘记指定流类型。
标签: intellij-idea lambda compilation java-8