2014-11-11 2 views
6

Этот код не компилируетсяCollectors.toMap не компилируется

List<String> pairs = new ArrayList<>(); 
System.out.println(pairs.stream().collect(Collectors.toMap(x -> x.split("=")[0], x -> x.split("=")[1]))); 

ошибку компиляции: Метод сплит (String) не определено для ошибки Тип объекта в System.out.println (пары .stream(). collect (Collectors.toMap (x -> x.split ("=") [0], x -> x.split ("=") [1])));

Но это одна отлично компилируется

List<String> pairs = new ArrayList<>(); 
Map<String,String> map = pairs.stream().collect(Collectors.toMap(x -> x.split("=")[0], x -> x.split("=")[1])); 
System.out.println(map); 

Может кто-нибудь объяснить, почему?

Дополнительная информация

Это было IntelliJ 12; jdk1.8.0_11; windows 64

+2

Обе версии скомпилированы и работают нормально на моем jdk1.8.0_20. Какую версию jdk вы используете? – Misha

+0

Невозможно воспроизвести: либо у вас есть старая версия jdk, либо вы используете другой компилятор (eclipse?). – assylias

+0

@All: Это воспроизводится с помощью Eclipse. Я использую новую версию Luna. Компилятор Eclipse показывает эту ошибку компилятора. Использование простой команды «javac ...» компилируется просто отлично. – Seelenvirtuose

ответ

0

Версии IntelliJ делают разные (только красные линии в редакторе исходного кода в среде IDE). Код должен быть скомпилирован JDK успешно.

IntelliJ 13 в порядке для вашего кода. IntelliJ 12 слабо поддерживает лямбда-выражение. Я также встречал аналогичные проблемы между двумя версиями IntelliJ при использовании лямбда-выражения.

4

Предполагаю, что вы используете IDE (например, Eclipse). Например, Eclipse использует собственный компилятор и не использует команду javac (от JDK).

Итак, я могу воспроизвести вашу проблему, но только с Eclipse. Просто компиляция этого кода в командной строке с помощью «javac» работает просто отлично.

Проблема очень проста: компилятор Eclipse не может вывести тип String для аргументов метода collect. Таким образом, он просто передает Object (так как это тип, который можно смело предположить). И Object не знает метод split.

Вы можете заставить компилятор знать о String по явно объявить тип внутри лямбда:

List<String> pairs = new ArrayList<>(); 
System.out.println(pairs.stream().collect(Collectors.toMap((String x) -> x.split("=")[0], x -> x.split("=")[1]))); 

... или по явно декларируя правильные типы для метода geneirc toMap:

List<String> pairs = new ArrayList<>(); 
System.out.println(pairs.stream().collect(Collectors.<String, String, String> toMap(x -> x.split("=")[0], x -> x.split("=")[1]))); 
Смежные вопросы