3 回答

TA貢獻1911條經驗 獲得超7個贊
.chars()
給你一個IntStream
,它是原始流int
,而不是字符流(更多信息)。這就是為什么沒有方法引用Character
會起作用的原因。
要實現您的目標,您Stream<Character>
首先需要:
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters) .chars() .mapToObj(e -> (char) e) .collect(Collectors.toMap(e -> e.hashCode(), Function.identity()));
現在,您仍然有使用方法引用獲取哈希碼的問題。您不能使用Character::hashCode
,因為它對您想要的方法不明確,因為有兩種可能的方法:
Object#hashCode 的覆蓋,
靜態方法
int hashCode(char value)
從這段代碼中可以看出,兩者都滿足 的第一個參數toMap()
:
Function<Character, Integer> f1 = e -> Character.hashCode(e); Function<Character, Integer> f2 = e -> e.hashCode();
要解決此問題,您可以使用Object::hashCode
非靜態方法調用。

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

TA貢獻1824條經驗 獲得超8個贊
首先,您需要將 映射IntStream到 a Stream<Character>。但在那之后你不能使用方法引用,Character::hashCode因為它是不明確的(對象級別和類級別):
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)因為該類使用以下方法Character覆蓋了它的方法:hashCode()Character.hashCode()
public final class Character ... {
@Override
public int hashCode() {
return Character.hashCode(value);
}
}
所以最后你可以使用這個:
Map<Integer, Character> asciiMap2 = CharBuffer.wrap(letters).chars()
.mapToObj(i -> (char) i)
.collect(Collectors.toMap(Object::hashCode, Function.identity()));
添加回答
舉報