Код выглядит так же. Метод Arrays.stream
, который вызывается на самом деле отличается в обоих случаях:
На Stream<String>
, вы можете вызвать map
и вернуть Stream<R>
на основе типа возвращаемого картографа. Но на LongStream
, map
всегда будет возвращать LongStream
, то есть первобытную специализацию. Случается, что Long::valueOf
превратит ваш элемент long
в объект Long
, а затем он будет автоматически распакован в long
; эффективно, вызов ничего не делает, кроме box/unbox.
Тогда проблема возникает на вызове collect
.
LongStream.collect
ожидает 3 аргумента
Stream.collect
имеет метод 3 аргумента, но и метод 1 аргумент, который является тот, который вы звоните с .collect(Collectors.toSet());
.
Таким образом, вы не можете позвонить .collect(Collectors.toSet());
по телефону LongStream
. Это не скомпилируется: он ожидает 3 аргумента.
Что вы можете сделать, это вызов mapToObj
вместо map
на LongStream
: этот метод объявляет возвращать Stream<R>
(вместо LongStream
) от типа возвращаемого картографа. В этом случае mapper равен Long::valueOf
, который возвращает объект Long
, поэтому он вернет Stream<Long>
.
Резюмируя:
long la[] = new long[] {1,2,3};
Arrays.stream(la).map(Long::valueOf).collect(Collectors.toSet());
//^--LongStream----^^---LongStream----^^ error
String la[] = new String[] {"1","2","3"};
Arrays.stream(la).map(Long::valueOf).collect(Collectors.toSet());
//^-Stream<String>-^^--Stream<Long>--^^---- successful call -----^
long la[] = new long[] {1,2,3};
Arrays.stream(la).mapToObj(Long::valueOf).collect(Collectors.toSet());
//^--LongStream----^^-----Stream<Long>-----^^---- successful call -----^
Это решит проблему, но не объясняет, почему первый фрагмент не компилирует tho тьфу. – Tunaki
Короче: 'Arrays.stream (la) .boxed(). Collect (Collectors.toSet());' –
'LongUnaryOperator o = Long :: valueOf' компилируется отлично. Это не проблема. – Tunaki