3 回答

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
.chars()
給你一個(gè)IntStream
,它是原始流int
,而不是字符流(更多信息)。這就是為什么沒有方法引用Character
會(huì)起作用的原因。
要實(shí)現(xiàn)您的目標(biāo),您Stream<Character>
首先需要:
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters) .chars() .mapToObj(e -> (char) e) .collect(Collectors.toMap(e -> e.hashCode(), Function.identity()));
現(xiàn)在,您仍然有使用方法引用獲取哈希碼的問題。您不能使用Character::hashCode
,因?yàn)樗鼘δ胍姆椒ú幻鞔_,因?yàn)橛袃煞N可能的方法:
Object#hashCode 的覆蓋,
靜態(tài)方法
int hashCode(char value)
從這段代碼中可以看出,兩者都滿足 的第一個(gè)參數(shù)toMap()
:
Function<Character, Integer> f1 = e -> Character.hashCode(e); Function<Character, Integer> f2 = e -> e.hashCode();
要解決此問題,您可以使用Object::hashCode
非靜態(tài)方法調(diào)用。

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
collect()
由于您使用的是after CharBuffer::chars
which returns的方法IntStream
,因此您可以使用的唯一收集方法是IntStream::collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
采用 3 個(gè)參數(shù)。
如果你想使用單參數(shù)收集方法,IntStream::boxed
在它之前放置 return Stream<Integer>
。然后該方法Character::hashCode
變得不明確,無法使用 lambda 表達(dá)式:
為避免這種情況,只需使用更好的方法直接mapToObj
轉(zhuǎn)換為char
而不需要裝箱,然后使用Object::hashCode
從 `Object 繼承:
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars() .mapToObj(ch -> (char) ch) .collect(Collectors.toMap(Object::hashCode, Function.identity()));

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
首先,您需要將 映射IntStream到 a Stream<Character>。但在那之后你不能使用方法引用,Character::hashCode因?yàn)樗遣幻鞔_的(對象級(jí)別和類級(jí)別):
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toMap(i -> Character.hashCode(i), Function.identity()));
或者,您可以只使用Object::hashCodeinstead ofi -> Character.hashCode(i)因?yàn)樵擃愂褂靡韵路椒–haracter覆蓋了它的方法:hashCode()Character.hashCode()
public final class Character ... {
@Override
public int hashCode() {
return Character.hashCode(value);
}
}
所以最后你可以使用這個(gè):
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toMap(Object::hashCode, Function.identity()));
添加回答
舉報(bào)