Der Code sieht nur gleich aus. Das Verfahren Arrays.stream
, die aufgerufen wird, ist tatsächlich anders in beiden Fällen:
Auf einem Stream<String>
zurückgibt, können Sie map
anrufen und geben einen Stream<R>
basierend auf dem Rückgabetyp der Mapper. Aber auf LongStream
, map
wird immer eine LongStream
zurückgeben, das ist die primitive Spezialisierung. Was passiert, ist, dass Long::valueOf
Ihr long
Element in ein Objekt verwandelt und dann wird es automatisch in eine long
entpackt; effektiv tut der Anruf nichts außer einer Box/Unbox.
Dann erscheint das Problem auf dem collect
Aufruf.
LongStream.collect
erwartet 3 Argumente
Stream.collect
ein 3 Argument Methode hat aber auch eine 1 Argument Methode, die diejenige, die Sie mit .collect(Collectors.toSet());
nennen ist.
So können Sie .collect(Collectors.toSet());
auf einem LongStream
nicht aufrufen. Dies wird nicht kompiliert: es erwartet 3 Argumente.
Was Sie tun können, ist Aufruf mapToObj
statt map
auf den LongStream
: Diese Methode deklariert eine Stream<R>
(anstelle eine LongStream
) aus dem Rückgabetyp des Mapper zurückzukehren. In diesem Fall ist der Mapper Long::valueOf
, der ein Objekt zurückgibt, so dass es eine Stream<Long>
zurückgibt.
Zur Erinnerung:
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 -----^
Dies wird das Problem lösen, aber es erklärt nicht, warum das erste Snippet kompiliert tho nicht Pfui. – Tunaki
Kürzere: 'Arrays.stream (la) .boxed(). Sammeln (Collectors.toSet());' –
'LongUnaryOperator o = Long :: valueOf' kompiliert fein. Das ist nicht das Problem. – Tunaki