Następujący kodbłędu podczas zbierania IntStream mapowania
String[] values = ...
....
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < values.length; i++) {
map.put("X" + i, values[i]);
}
jest przekształcany przez IntelliJ do:
Map<String, Object> map = IntStream.range(0, values.length)
.collect(Collectors.toMap(
i -> "X" + i,
i -> values[i],
(a, b) -> b));
, które mogą być skrócone, aby
Map<String, Object> map = IntStream.range(0, values.length)
.collect(Collectors.toMap(
i -> "X" + i,
i -> values[i]));
od 2 wersjach strumienia don” t skompilować.
IntelliJ, sugeruje, że istnieje problem z I w wartości [i]:
Incompatible types.
Required: int
Found: java.lang.Object
Kompilator skarży się:
Error:(35, 17) java: method collect in interface java.util.stream.IntStream cannot be applied to given types;
required: java.util.function.Supplier,java.util.function.ObjIntConsumer,java.util.function.BiConsumer
found: java.util.stream.Collector>
reason: cannot infer type-variable(s) R
(actual and formal argument lists differ in length)
może ktoś wyjaśnić dlaczego?
co jest 'wartości ", czy mógłbyś dołączyć także swoją deklarację? Również na sugestię IntelliJ, wydaje się niespójne. Wystarczy wydrukować instrukcję 'map' między deklaracją a pętlą. To nie sugeruje już, abyś * zastąpił kolekcją *. – nullpointer
String [] values = ... – msayag
Wyobrażam sobie, że 'Collector's nie obsługuje prymitywów, i to może być powodem, dla którego lambdy są konwertowane na' Object', ponieważ 'boxed()' naprawia to. –