2016-07-12 3 views
4

У меня есть поток int и хочу, чтобы каждый элемент этого потока выполнял некоторые вычисления и возвращал их как Map, где ключи являются значениями int, а значения являются результатом этих вычислений. Я написал следующий фрагмент кода:Преобразование int потока для отображения

IntStream.range(0,10).collect(Collectors.toMap(Function.identity(), i -> computeSmth(i))); 

где computeSmth(Integer a). Я получил следующую ошибку компилятора

method collect in interface java.util.stream.IntStream cannot be applied to given types; 
    required: java.util.function.Supplier<R>,java.util.function.ObjIntConsumer<R>,java.util.function.BiConsumer<R,R> 
    found: java.util.stream.Collector<java.lang.Object,capture#1 of ?,java.util.Map<java.lang.Object,java.lang.String>> 
    reason: cannot infer type-variable(s) R 
    (actual and formal argument lists differ in length) 

Что я делаю неправильно?

+6

'IntStream' только имеет 3-аргумент' collect'. Вы должны либо переписать свой 'toMap' в форме 3-arument, либо преобразовать' IntStream' в 'Stream ' с '.boxed()' – Misha

+0

@Misha Спасибо, я только что узнал о 'boxed()'. Это, безусловно, улучшение по сравнению с mapToObj (Integer :: valueOf) '. :-) –

ответ

4

Вот мой код, он будет работать для вас.

Справочник по функциям версия

public class AppLauncher { 

public static void main(String a[]){ 
    Map<Integer,Integer> map = IntStream.range(1,10).boxed().collect(Collectors.toMap(Function.identity(),AppLauncher::computeSmth)); 
    System.out.println(map); 
} 
    public static Integer computeSmth(Integer i){ 
    return i*i; 
    } 
} 

Лямбда выражение версия

public class AppLauncher { 

    public static void main(String a[]){ 
     Map<Integer,Integer> map = IntStream.range(1,10).boxed().collect(Collectors.toMap(Function.identity(),i->i*i)); 
     System.out.println(map); 
    } 
} 
+0

Действительно, '.boxed()' был ключом к успеху! – user1075613

Смежные вопросы